Matlab非线性拟合给定方程
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/11/12 12:34:31
Matlab非线性拟合给定方程
程序如下,就是找不到那里错了.求大神指教.
x=[3252 3476 3814 6615 8075 9438 10448 26112 28594 31651];
y=[0.7/10.4 1.7/10.4 2.7/10.4 3.7/10.4 4.7/10.4 5.7/10.4 6.7/10.4 7.7/10.4 8.7/10.4 9.7/10.4]; func=inline('1-exp(-(((x-a(1))./(a(2)-a(1))).^a(3)))','a','x');
a=nlinfit(x,y,func,[0 0 0]);
结果总是有warning的提示,说是Jacobian的Volumns是0,模型无意义.
我尝试把a的初值定义为[1 1 1],或者[-999 -999 -999],但都是同样的错误.
我给定的方程其实就是Weibull函数.我想通过matlab直接拟合出其中的三个参数.
0
程序如下,就是找不到那里错了.求大神指教.
x=[3252 3476 3814 6615 8075 9438 10448 26112 28594 31651];
y=[0.7/10.4 1.7/10.4 2.7/10.4 3.7/10.4 4.7/10.4 5.7/10.4 6.7/10.4 7.7/10.4 8.7/10.4 9.7/10.4]; func=inline('1-exp(-(((x-a(1))./(a(2)-a(1))).^a(3)))','a','x');
a=nlinfit(x,y,func,[0 0 0]);
结果总是有warning的提示,说是Jacobian的Volumns是0,模型无意义.
我尝试把a的初值定义为[1 1 1],或者[-999 -999 -999],但都是同样的错误.
我给定的方程其实就是Weibull函数.我想通过matlab直接拟合出其中的三个参数.
0
可能是因为P(v)对参数b太敏感,成为病态函数.可以改写函数成ln(-ln(1-P)) = b ln((v-v0)/(va-v0)).代码如示:
v = [3252 3476 3814 6615 8075 9438 10448 26112 28594 31651];
p = [0.7/10.4 1.7/10.4 2.7/10.4 3.7/10.4 4.7/10.4 5.7/10.4 6.7/10.4 7.7/10.4 8.7/10.4 9.7/10.4];
f = @(a,v)a(3)*log((v-a(1))/(a(2)-a(1)));
a = nlinfit(v,log(-log(1-p)),f,[1 2 3])
plot(v,p,'o',v,1-exp(-exp(f(a,v))));
此外,这一题还可以使用遗传算法来求解(因为x较大,这里将其放缩):
v = [3252 3476 3814 6615 8075 9438 10448 26112 28594 31651]/10000;
p = [0.7/10.4 1.7/10.4 2.7/10.4 3.7/10.4 4.7/10.4 5.7/10.4 6.7/10.4 7.7/10.4 8.7/10.4 9.7/10.4];
f = @(a,v)1-exp(-(((v-a(1))./(a(2)-a(1))).^a(3)));
a = ga(@(a)norm(p-f(a,v)),3);
a([1 2]) = a([1 2])*10000
plot(v,p,'o',v,f(a,v*10000));
结果与改写函数类似.
v = [3252 3476 3814 6615 8075 9438 10448 26112 28594 31651];
p = [0.7/10.4 1.7/10.4 2.7/10.4 3.7/10.4 4.7/10.4 5.7/10.4 6.7/10.4 7.7/10.4 8.7/10.4 9.7/10.4];
f = @(a,v)a(3)*log((v-a(1))/(a(2)-a(1)));
a = nlinfit(v,log(-log(1-p)),f,[1 2 3])
plot(v,p,'o',v,1-exp(-exp(f(a,v))));
此外,这一题还可以使用遗传算法来求解(因为x较大,这里将其放缩):
v = [3252 3476 3814 6615 8075 9438 10448 26112 28594 31651]/10000;
p = [0.7/10.4 1.7/10.4 2.7/10.4 3.7/10.4 4.7/10.4 5.7/10.4 6.7/10.4 7.7/10.4 8.7/10.4 9.7/10.4];
f = @(a,v)1-exp(-(((v-a(1))./(a(2)-a(1))).^a(3)));
a = ga(@(a)norm(p-f(a,v)),3);
a([1 2]) = a([1 2])*10000
plot(v,p,'o',v,f(a,v*10000));
结果与改写函数类似.