关于matlab数值优化问题,利用lsqcurvefit进行参数拟合

程序:functionF=lutaolin_1_adj(x);%分别拟合不同垂直载荷下的B,D,ESv=0;Sh=0;C=1.65;%垂直载荷共有4组,对每组分别拟合,分... 程序:
function F=lutaolin_1_adj(x);
% 分别拟合不同垂直载荷下的B,D,E
Sv=0;
Sh=0;
C = 1.65;

% 垂直载荷共有4组,对每组分别拟合,分别得到B, D, E
%以下是四组实验数据

%Fz=1985.37/1000;
%xdata_kappa=[0.00 1.03 0.99 1.02 1.12 1.75 3.43 11.49 100.00];
%ydata_Fx=[0.00 234.88 284.69 314.99 355.93 386.90 603.34 752.94 935.93];

%Fz=3624.99/1000;
%xdata_kappa=[0.00 0.24 0.81 1.13 1.51 2.74 6.88 51.25
%100.00];
%ydata_Fx=[0.00 255.39 467.91 783.34 964.73 1129.76 1342.61
%1563.66 1605.09];

Fz=4842.20/1000;
xdata_kappa=[0.00 0.26 0.73 1.02 1.28 1.93 2.39 4.17];
ydata_Fx=[0.00 228.13 784.07 946.62 1180.25 1341.57 1590.54 1776.902];

%Fz=7500.82/1000;
%xdata_kappa=[0.00 0.17 0.30 0.21 0.65 0.64 1.15 1.21
%0.93 1.59];
%ydata_Fx=[0.00 363.20 483.26 713.36 934.30 1064.25 1241.40
%1370.64 1655.24 1951.03];

% 设x = [B D E]
%x0 = [0.3 1800 0.7];% Fz=2003N 待拟合变量的初始值
%x0 = [0.3 3000 0.6];%Fz=3635N 待拟合变量的初始值
x0 = [0.2 4000 0.3];%Fz=4865N 待拟合变量的初始值
%x0 = [0.3 6000 0.9];%Fz=7535N 待拟合变量的初始值
opt=optimset('MaxIter',1000,'MaxFunEvals',3000,'tolx',1e-16,'tolf',1e-9);%MaxIter最大迭代次数 MaxIter函数评价的最大次数 tolx tolf 为控制误差
x = lsqcurvefit(@magicformula,x0,xdata_kappa,ydata_Fx,[],[],opt);%[][]采用默认设置 若为lb,rb是定义了x的解算范围
B = x(1)
D = x(2)
E = x(3)

% 利用当前拟合后的数据计算新的一组fx,然后画图对比
fx_mf =x(2)*sin(1.65*atan(x(1)*(xdata_kappa)-x(3)*(x(1)*(xdata_kappa)-atan(x(1)*(xdata_kappa)))));

figure(1)
plot(xdata_kappa,-ydata_Fx,'k-',xdata_kappa,-fx_mf,'k--');
xlabel('滑移率');ylabel('纵向力(N)');
legend('原始数据','拟合数据');
grid on

function fx_mf = magicformula(x, xdata_kappa)
% x = [B D E]
fx_mf =x(2)*sin(1.65*atan(x(1)*(xdata_kappa)-x(3)*(x(1)*(xdata_kappa)-atan(x(1)*(xdata_kappa)))));

这是一个利用函数lsqcurvefit进行拟合的程序。
这是其中第一组数据拟合出来的图形,后来出现了线性的变化,应该是比较圆滑的曲线。
还有直线的走向也有问题。
走向应该是如图其中滑移率大于0的部分。
最后进行拟合,应该还有误差,我不太清楚这个误差是怎么得到的。
跪求高手。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
展开
 我来答
淡定的先知
2011-05-28 · TA获得超过456个赞
知道答主
回答量:50
采纳率:0%
帮助的人:0
展开全部
Sv,Sh,C,Fz你的程序中没有用到
MaxFunEvals 3000次不够,建议迭代次数都用默认

四组数据中有些有问题
算出来的结果当然和你给的图不一样
更多追问追答
追问
但是最后拟合出来的图形尽然是这样的。
你再看前面x、Fx给予的值也都是大于0的,但是最后拟合出来的竟然是Fx小于0,符号全部弄反了。
本身就是对一组参数进行拟合的,还有最后是怎么算出它的误差的呢?
追答
plot(xdata_kappa,-ydata_Fx,'k-',xdata_kappa,-fx_mf,'k--');
你在画图时ydata_Fx和fx_mf前面都有负号,画出来当然小于0

lsqcurvefit函数本身能返回残差的平方和resnorm
将程序改为
[x,resnorm] = lsqcurvefit(@magicformula,x0,xdata_kappa,ydata_Fx,[],[],opt);

resnorm就是误差,越小越精确
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式