两种方法在MATLAB中实现共享参数拟合的源代码【MATLAB pk 1stopt】

news2024/11/20 0:36:33

有伙伴在巴山学长交流群中询问有关如何在matlab中实现共享参数拟合的问题,感觉这个问题挺有意思的,故拿出来与大家分享。咱也根据伙伴的提问在网上进行了相关搜索,发现这个共享参数拟合的问题基本上都跟国产拟合优化神器1stopt这款软件有关。不巧咱手里正好就有1stopt的正版授权,所以就把MATLAB与1stopt两个工具的结果做一个比较。

根据1stopt帮助文件中有关共享拟合模式的概念,共享参数指的是不同的拟合公式中拥有一个或多个相同的参数。这里咱也直接从1stopt共享拟合模式的案例中copy一个简单案例,案例中自变量相同,因变量不同,公式间存在三个相同的参数,如下图所示:
案例公式,来源1stopt 9.0版帮助文档57页
上式中,m1、m2与v 为共享参数,p1、p2、p3、p4、c1、c2、c3与c4为各自独立参数。

首先给出1stopt的拟合脚本和拟合结果,脚本中SharedModel函数表明了将采用共享拟合模式来进行函数拟合:

ConstStr k1=m1*(1+1/m2), k2=m1*(1+3/m2), k3=m1*(1+10/m2), k4=m1*(1+30/m2);
SharedModel;
Variable x,y(4); //y1, y2, y3, y4;
Function y1 = v*x/(k1+x)+p1*x+c1;
y2 = v*x/(k2+x)+p2*x+c2;
y3 = v*x/(k3+x)+p3*x+c3;
y4 = v*x/(k4+x)+p4*x+c4;
Data;
//x, y1, y2, y3, y4
0. 0.0 0.0 0.0 0.0
50. 17.0261 7.227563 3.574113 0.0
100. 22.16059 13.34309 8.142564 0.1
150. 30.64281 17.76278 13.55202 4.805006
200. 33.57431 25.08648 10.82765 5.232621
400. 50.40222 38.048 21.93352 14.57796
600. 58.35754 45.00776 25.49771 13.45863
800. 62.68015 50.51803 31.82192 15.86972
1000. 63.53971 52.56842 38.12983 20.90453
10000. 81.0 74.3 70.9 61.7

1stopt拟合结果:

模型公式: y1 = v*x/(m1*(1+1/m2)+x)+p1*x+c1
          y1 = 79.285487953062*x/(161.92240019*(1+1/1.69035902588378)+x)+0.000243188152287981*x+1.33059469706138
模型公式: y2 = v*x/(m1*(1+3/m2)+x)+p2*x+c2
          y2 = 79.285487953062*x/(161.92240019*(1+3/1.69035902588378)+x)+(-0.000109829649274472)*x+(-0.534912686375696)
模型公式: y3 = v*x/(m1*(1+10/m2)+x)+p3*x+c3
          y3 = 79.285487953062*x/(161.92240019*(1+10/1.69035902588378)+x)+(-9.86675078550804e-5)*x+0.41551196660862
模型公式: y4 = v*x/(m1*(1+30/m2)+x)+p4*x+c4
          y4 = 79.285487953062*x/(161.92240019*(1+30/1.69035902588378)+x)+6.26503046551593e-5*x+0.404808726452002

迭代数: 46
计算用时(:::微秒): 00:00:09:55
优化算法: 通用全局优化算法(UGO1)
计算结束原因: 达到收敛判断标准
均方差(RMSE): 1.55565198313939
残差平方和(SSE): 96.8021237058205
相关系数(R): 0.996911737530229
相关系数之平方(R^2): 0.99383301242554
修正R平方(Adj. R^2): 0.986133009531572
确定系数(DC): 0.993760361119802
F统计(F-Statistic): -24.9047633355909

参数            最佳估算
--------------------  -------------
v  79.285487953062
m1  161.92240019
m2  1.69035902588378
p1  0.000243188152287981
c1  1.33059469706138
p2  -0.000109829649274472
c2  -0.534912686375696
p3  -9.86675078550804E-5
c3  0.41551196660862
p4  6.26503046551593E-5
c4  0.404808726452002

不得不惊叹1stopt的通用全局优化算法的强大,在未给任何初始值的情况下仅花了9秒的时间就完成了拟合,且y1,y2,y3与y4各自拟合值与实际值的mse仅为2.2616 , 0.85414 , 2.8022 , 3.7623,如下图:
1stopt的拟合效果
在matlab中,并没有明确共享参数拟合的这种概念,而且所有拟合均需要提供合适初始值或范围。本文决定采用直接法——非线性拟合函数lsqcurvefit与智能优化算——粒子群算法函数particleswarm来求解。

一、直接法——非线性拟合函数lsqcurvefit

为了更快达到较为理想的效果,参考1stopt的拟合结果,将所有参数的范围限定在-300到+300之间,初始值在此范围中随机生成,相应代码如下:


clear;close all;

%原始数据:x, y1, y2, y3, y4
dat = [0. 0.0 0.0 0.0 0.0
      50. 17.0261 7.227563 3.574113 0.0
      100. 22.16059 13.34309 8.142564 0.1
      150. 30.64281 17.76278 13.55202 4.805006
      200. 33.57431 25.08648 10.82765 5.232621
      400. 50.40222 38.048 21.93352 14.57796
      600. 58.35754 45.00776 25.49771 13.45863
      800. 62.68015 50.51803 31.82192 15.86972
      1000. 63.53971 52.56842 38.12983 20.90453
      10000. 81.0 74.3 70.9 61.7];

t = dat(:,1); y1= dat(:,2); y2= dat(:,3); y3= dat(:,4); y4= dat(:,5);
%{
    共享参数:m1、m2、v;k1~k3
    独立参数:p1, p2, p3, p4, c1, c2, c3, c4; k4~k11
    中间参数:k1 = m1*(1+1/m2), k2 = m1*(1+3/m2), k3 = m1*(1+10/m2), k4 = m1*(1+30/m2);

    原方程:y1 = v*x/(k1+x)+p1*x+c1;
             y2 = v*x/(k2+x)+p2*x+c2;
             y3 = v*x/(k3+x)+p3*x+c3;
             y4 = v*x/(k4+x)+p4*x+c4;
%}
fun = @(k,t) [k(3)*t./(k(1)*(1+1/k(2))+t)+k(4)*t+k(8);...
    k(3)*t./(k(1)*(1+3/k(2))+t)+k(5)*t+k(9);...
    k(3)*t./(k(1)*(1+10/k(2))+t)+k(6)*t+k(10);...
    k(3)*t./(k(1)*(1+30/k(2))+t)+k(7)*t+k(11)];

lb = -300*ones(1,11);
ub = 300*ones(1,11);
k0 = -300+600*rand(1,11);
tic;
[kx,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(fun, k0, t,[y1;y2;y3;y4],lb,ub,[]);
disp(['lsqcurvefit用时:',num2str(toc),'秒']);

len = length(t);
ny  = fun(kx,t);
ny1 = ny(1:len);
ny2 = ny(len+1:2*len);
ny3 = ny(2*len+1:3*len);
ny4 = ny(3*len+1:end);
figure('Color','w');
tx = 1:len;
plot(tx,y1,'r*',tx,ny1,'ro-','MarkerSize',7,'LineWidth',1.8);
hold on;
plot(tx,y2,'b*',tx,ny2,'bo-','MarkerSize',7,'LineWidth',1.8);
plot(tx,y3,'k*',tx,ny3,'ko-','MarkerSize',7,'LineWidth',1.8);
plot(tx,y4,'m*',tx,ny4,'mo-','MarkerSize',7,'LineWidth',1.8);
hold off;
legend('y1真实值','y1拟合值','y2真实值','y2拟合值','y3真实值','y3拟合值','y4真实值','y4拟合值','Location','best');
title(['MSE: y1: ',num2str(mse(y1,ny1)),' , y2: ',num2str(mse(y2,ny2)),' ,y3: ',num2str(mse(y3,ny3)),' ,y4: ',num2str(mse(y4,ny4))]);

非线性拟合函数lsqcurvefit的拟合结果如下图所示:
在这里插入图片描述
不难看出,非线性拟合函数的结果与1stopt还是存在很大差距的。需要指出的是,由于初始值是随机给定的,并不能保证每次拟合结果都完全相同,特别糟糕的情况下甚至会出现拟合失败的现象。

二、智能优化算——粒子群算法函数particleswarm

对于粒子群算法,无需给定初始,仅需给出参数的范围即可,同样采用-300到+300的区间,相关代码如下:


tic;
nvars   = 11;
lb = -300*ones(1,11);
ub = 300*ones(1,11);
options = optimoptions('particleswarm','SwarmSize',100,...
    'MaxIterations',200,...
    'HybridFcn',@fmincon,'PlotFcn','pswplotbestf');
[kx,fval,exitflag,output,points] = particleswarm(@psofcn,nvars,lb,ub,options);
disp(['PSO用时:',num2str(toc),'秒']);

len = length(t);
ny  = fun(kx,t);
ny1 = ny(1:len);
ny2 = ny(len+1:2*len);
ny3 = ny(2*len+1:3*len);
ny4 = ny(3*len+1:end);
figure('Color','w');
tx = 1:len;
plot(tx,y1,'r*',tx,ny1,'ro-','MarkerSize',7,'LineWidth',1.8);
hold on;
plot(tx,y2,'b*',tx,ny2,'bo-','MarkerSize',7,'LineWidth',1.8);
plot(tx,y3,'k*',tx,ny3,'ko-','MarkerSize',7,'LineWidth',1.8);
plot(tx,y4,'m*',tx,ny4,'mo-','MarkerSize',7,'LineWidth',1.8);
hold off;
legend('y1真实值','y1拟合值','y2真实值','y2拟合值','y3真实值','y3拟合值','y4真实值','y4拟合值','Location','best');
title(['MSE: y1: ',num2str(mse(y1,ny1)),' , y2: ',num2str(mse(y2,ny2)),' ,y3: ',num2str(mse(y3,ny3)),' ,y4: ',num2str(mse(y4,ny4))]);


function re = psofcn(x)
% 目标函数,此处选择实际值与拟合值的mse的最大值作为优化目标
dat = [0. 0.0 0.0 0.0 0.0
      50. 17.0261 7.227563 3.574113 0.0
      100. 22.16059 13.34309 8.142564 0.1
      150. 30.64281 17.76278 13.55202 4.805006
      200. 33.57431 25.08648 10.82765 5.232621
      400. 50.40222 38.048 21.93352 14.57796
      600. 58.35754 45.00776 25.49771 13.45863
      800. 62.68015 50.51803 31.82192 15.86972
      1000. 63.53971 52.56842 38.12983 20.90453
      10000. 81.0 74.3 70.9 61.7];

t = dat(:,1); y1= dat(:,2); y2= dat(:,3); y3= dat(:,4); y4= dat(:,5);

m1 = x(1);
m2 = x(2);
v  = x(3);
p1 = x(4);
p2 = x(5);
p3 = x(6);
p4 = x(7);
c1 = x(8);
c2 = x(9);
c3 = x(10);
c4 = x(11);

k1 = m1*(1+1/m2); 
k2 = m1*(1+3/m2);
k3 = m1*(1+10/m2);
k4 = m1*(1+30/m2);

ny1 = v*t./(k1+t)+p1*t+c1;
ny2 = v*t./(k2+t)+p2*t+c2;
ny3 = v*t./(k3+t)+p3*t+c3;
ny4 = v*t./(k4+t)+p4*t+c4;

re  = max([mse(y1,ny1),mse(y2,ny2),mse(y3,ny3),mse(y4,ny4)]);
end

粒子群算法函数particleswarm的拟合结果如下图所示:
在这里插入图片描述
相较于非线性拟合函数,粒子群优化算法具有更强的全局优化能力,结果也更接近1stopt的拟合结果。当然正如前面所讲,由于初始值都是随机给的,并不能保证每次结果都一定收敛,可能有时候效果好有时候效果差,针对这种情况,建议就是多跑几次程序。

本文案例是共享参数拟合最简单的案例,即自变量是相同的。对于自变量取值不相同、自变量长度不一、甚至是缺省等复杂情况用matlab又该如何处理呢?欢迎感兴趣的伙伴留言分享自己的见解看法。

点此阅读原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1955004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue基础2

1.监视属性 先推荐大家安装第一个vscode常用插件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>天气案例_监视简写</title><!-- 引入Vue --><script type"text/javascript"…

Linux环境下(DeepinV20+)安装并配置jdk和maven

一、jdk下载 Oracle的JDK开始收费了&#xff0c;如非必要&#xff0c;请勿使用&#xff01;&#xff01;&#xff01; jdk下载地址1&#xff08;推荐&#xff09;https://github.com/graalvm/graalvm-ce-builds/releases jdk下载地址2&#xff08;可选&#xff09;&#xff1a;…

PsExec横向:IPCPTHPTT

一.IPC下的PsExec 二.PTH下的psexec&#xff08;CS操作&#xff09; 三.PTT下的psexec PsExec工具&#xff1a; psexec 是 windows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口&#xff0c;只需要对方开启admin$共享和ipc$ (该共享默认开启&#…

8. 运行时数据区-堆

一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。栈上的局部变量表中&#xff0c;可以存放堆上对象的引用。静态变量也可以存放堆对象的引用&#xff0c;通过静态变量就可以实现对象在线程之间共享。 堆内存的调优 堆空间有三个需要关注的值&…

自编码器(autoencoder)

1.自编码器的由来 最初的自编码器是用来降维的&#xff0c;后来也逐渐用于去噪、生成任务。 2.自编码器的基本结构 自编码器&#xff08;autoencoder&#xff09;内部有一个隐藏层 h&#xff0c;可以产生编码&#xff08;code&#xff09;表示输入。该网络可以看作由两部分组…

yolo模型训练出的.pt文件过大

当我们使用yolov8训练时候&#xff0c;保存的模型变大&#xff0c;如下图&#xff1a; 原模型 训练出来的模型 经过仔细调查&#xff0c;发现是保存的模型中多了很多数据。 原模型 训练出来的模型 只需要把文件中.pt文件读取&#xff0c;重写一遍保存。 from ultralytics im…

【RabbitMQ】MQ相关概念

一、MQ的基本概念 定义&#xff1a;MQ全称为Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信&#xff0c;而无需建立直接的连接。作用&#xff1a;主要用于分布式系统之间的通信&#x…

[工具]GitHub + PicGo 搭建免费博客图床

文章目录 起因GitHub新建GitHub仓库新建token授予picgo权限 PicGOPicGO上传失败原因 起因 还是觉得个人博客记录最好还是不要money&#x1f625;&#xff0c;所以还是想白嫖&#xff0c;找到了GitHub PicGO的方式&#xff0c;记录一下。 GitHub 过程和搭建博客链接类似&…

【C++】红黑树的应用(封装map和set)

✨ 青山一道同云雨&#xff0c;明月何曾是两乡 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &…

SpringBoot3 JDK21 Vue3开源后台RBAC管理系统 | 2024年好用的开源RBAC管理系统 | 数据权限的探索

序言 项目现已全面开源&#xff0c;商业用途完全免费&#xff01; 当前版本&#xff1a;v0.7.2。 如果喜欢这个项目或支持作者&#xff0c;欢迎Star、Fork、Watch 一键三连 &#x1f680;&#xff01;&#xff01; 在构建此代码框架的过程中&#xff0c;我已投入了大量精力&…

51单片机嵌入式开发:20、STC89C52R基于C51嵌入式点阵广告屏的设计

STC89C52R基于C51嵌入式点阵广告屏的设计 1 概述2 LED点阵介绍2.1 特点和优势2.2 工作原理&#xff1a;2.3 使用方法&#xff1a; 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路3.3 74HC595 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 总结 配套示例程序 1…

寻找事业伴侣:男人如何找到匹配自己事业的女人

寻找事业伴侣&#xff1a;男人如何找到匹配自己事业的女人 前言 在攀登事业的征途上&#xff0c;每位男士都渴望有一位能够并肩作战的伴侣。她不仅要理解你的抱负&#xff0c;还要支持你的每一个决定。但现实中&#xff0c;找到这样的女人并非易事。 以下是一些深入的建议&a…

Linux信号上

信号 概念 信号是由于进程产生&#xff0c;但是由内核调度传递给另一个进程&#xff1a; 产生信号 按键产生信号: Ctrc --> 2)SIGINT(终止/中断) Ctrz --> 20)SIGTSTOP(终端暂停) Ctr\ --> 3)SIGQUIT(退出) 系统调用产生: kill(2), raise, abort软件条件产生: 如定…

Adobe Acrobat Pro DC for Mac:PDF处理软件

Adobe Acrobat Pro DC for Mac是一款专为Mac用户设计的PDF处理软件&#xff0c;它凭借出色的功能和卓越的性能&#xff0c;成为了处理PDF文件的理想选择。 首先&#xff0c;Acrobat Pro DC for Mac支持全方位的PDF编辑。用户可以对PDF文档进行文本编辑、图像处理、表格制作等操…

【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能

审核看清楚了 &#xff01; 这是以太坊测试网络&#xff01;用于学习的测试网络&#xff01;&#xff01;&#xff01; 有关web3 和区块链的内容为什么要给我审核不通过&#xff1f; 别人凭什么可以发&#xff01; 目标成果&#xff1a; 实现功能分析&#xff1a; 显示账户信…

CORS-跨域资源共享

CORS-跨域资源共享 什么是CORS &#xff1f; 在前后端分离的项目中&#xff0c;我们往往会遇到跨域问题。 跨域问题只会出现在浏览器发起AJAX&#xff08;XMLHttpRequest、Fetch&#xff09;请求的时候&#xff0c;因为浏览器限制了AJAX只能从同一个源请求资源&#xff0c;除…

DeadSec CTF 2024 Misc Writeup

文章目录 MiscWelcomeMic checkflag_injectionGoLPartyMAN in the middleForgotten Password CryptoFlag killer 好久没做这么爽了噜 DK盾云服务器&#xff1a; https://www.dkdun.cn/ 最近活动是香港的1-1-3 9.9/月 Misc Welcome 进discord群签到即可 Mic check 就是他说…

echarts所遇到的问题,个人记录

TreeMap 矩形树图&#xff0c;label设置富文本之后&#xff0c;无法垂直居中 font-size 支持rem&#xff0c;其余不支持 font-size 支持 rem&#xff0c;但是其余的属性如height&#xff0c;width等不支持 echarts-for-react 绑定事件&#xff0c;会覆盖实例上绑定的 当给cha…

通过服务端注入的广告被拦截 YouTube现在可能会出现黑屏静音视频段

为避免用户使用广告拦截程序直接拦截 YouTube 平台的所有广告&#xff0c;这段时间谷歌正在采取各种措施与社区进行技术对抗&#xff0c;即谷歌不停地开发新的广告检测方式阻止用户使用广告拦截程序&#xff0c;广告拦截程序则不停地开发应对方法用来继续屏蔽广告和各种提示。 …

uni-app全局文件与常用API

文章目录 rpx响应式单位import导入css样式及scss变量用法与static目录import导入css样式uni.scss变量用法 pages.json页面路由globalStyle的属性pages设置页面路径及窗口表现tabBar设置底部菜单选项及iconfont图标 vite.config中安装插件unplugin-auto-import自动导入vue和unia…