作业帮 > 综合 > 作业

如何用一组实验数据和一个非线性方程求出非线性方程的系数

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/29 14:19:41
如何用一组实验数据和一个非线性方程求出非线性方程的系数
你指的是对于数据处理的非线性拟合吗?一般来说,最好是将非线性方程线性化,比如关系是y = a*exp(b*x),可以取对数得到:lny = b*x +lna,然后将ln和x线性拟合得到a、b.如果比较复杂可以使用软件处理,比如origin,挺好用的数据处理软件.如果非要自己做,最好去学习非线性拟合的统计理论,计算的算法一般是LM算法,这个要编程实现,很麻烦的.
再问: x=[0.111 0.1528 0.1567 0.272 0.4141 0.8753 0.8795 1.4447 2.2567 3.0167 5.166] y=[407784 339167 311987 238547 129897 51595 30775 18820 7057 2082 651] b0=[1 2 3 4]; [b,res]=lsqcurvefit(@mihanshu1,b0,x,y) function F=mihanshu1(a,x) F=((1+a(1))*(2*a(3)*((1+x).^(a(4)-1)-(1+x).^(-a(4)/2+2)).^2/(a(4)*a(2)*((a(4)-1)*(1+x).^(a(4)-2)+(a(4)/2+1)*(1+x).^(-a(4)/2-2)))).^a(1)).^(-1);大神帮帮忙,这程序老错
再答: 因为你的F=mihanshu1函数有问题,当你的x是数组的时候,返回的却不是数组。原因是你里面有含x*x或者x/x的项,matlab就不会给你返回数组了。 你可以吧F函数修改下,比如改成循环之类的就可以了。 比如这样: function F=mihanshu1(a,x) F = x; for i = 1:length(x) F(i)=((1+a(1))*(2*a(3)*((1+x(i)).^(a(4)-1)-(1+x(i)).^(-a(4)/2+2)).^2/(a(4)*a(2)*((a(4)-1)*(1+x(i)).^(a(4)-2)+(a(4)/2+1)*(1+x(i)).^(-a(4)/2-2)))).^a(1)).^(-1); end 然后那个拟合就没问题了
再问: 能否帮我编写个完整的程序,非常感谢!分还是给你的
再答: 嗯?如果你做的拟合就是你刚才说的数据的话,你的代码是没有问题的啊。 用matlab先建一个M-File:文件名mihanshu1.m 内容: function F=mihanshu1(a,x) F = x; for i = 1:length(x) F(i)=((1+a(1))*(2*a(3)*((1+x(i)).^(a(4)-1)-(1+x(i)).^(-a(4)/2+2)).^2/(a(4)*a(2)*((a(4)-1)*(1+x(i)).^(a(4)-2)+(a(4)/2+1)*(1+x(i)).^(-a(4)/2-2)))).^a(1)).^(-1); end 然后你就可以在命令窗进行拟合了,比如在命令窗输入 x=[0.111 0.1528 0.1567 0.272 0.4141 0.8753 0.8795 1.4447 2.2567 3.0167 5.166]; y=[407784 339167 311987 238547 129897 51595 30775 18820 7057 2082 651]; b0=[1 2 3 4]; [b,res]=lsqcurvefit(@mihanshu1,b0,x,y) 然后你看到的就是拟合的结果了。 >> b = Columns 1 through 3 0.52567348899695 4.11005692224696 1.02414970691079 Column 4 2.00004758005369 res = 14408603754.2092 >> 额,如果你说的是要自己写一个独立的exe程序,那就另当别论了。