liqifu 发表于 2008-11-4 10:21:04

非线性拟合(多目标规划的pareto方法)

本帖最后由 messenger 于 2009-12-6 00:45 编辑


已知一个6个未知数的非线性模型方程:
    y=0.2997*exp[(x/10^(b+cq))^m],其中依次为q0=14,18,22,26,30。
在不同应力下的数据(数据在origin中作出了图形)见压缩文件内,如何进行非线性拟合求参数a,b,c,m,n和应力q。

用遗传算法的一个拟合结果为:
a=0.0178,b=7.3637,c=-0.08445,m=0.5,0.2,q=14。
最大误差不到1%,勉强可以! 请问哪位高手有更好的结果请出招吧!:handshake:handshake:handshake






[ 本帖最后由 liqifu 于 2008-12-6 21:58 编辑 ]

ljelly 发表于 2008-11-4 10:31:12

matlab的curve fitting toolbox可以进行相关的拟合
在命令窗口中输入cftool
通过data按钮,输入你的数据
再通过fitting按钮,进行拟合
唯一的区别是在Type of fit中要选择Custom Equations选项
再在下方输入你的方程即可
如果你的方程是五阶或是六阶多项式
则可以在Type of fit中选择Polynomial选项
在下方选择相应的阶数即可
运行后,会在Results窗口中显示各未知数的值
至于结果准不准,看你选择的方法和结果,自己来定

[ 本帖最后由 ljelly 于 2008-11-4 10:33 编辑 ]

liqifu 发表于 2008-11-4 20:11:14

非常感谢1楼的朋友!你说的可以解决一个应力下的问题(见下框内),ORIGIN中也可以进行的;但是,在不同的应力下获得的模型数据都要合适啊,这就比较麻烦了,可能要用MATLAB进行优化编程处理或者遗传算法什么的吧!


Matlab的曲线拟合工具箱CFtool使用简介

一、
单一变量的曲线逼近
Matlab有一个功能强大的曲线拟合工具箱 cftool ,使用方便,能实现多种类型的线性、非线性曲线拟合。下面结合我使用的 Matlab R2007b 来简单介绍如何使用这个工具箱。
假设我们要拟合的函数形式是 y=A*x*x + B*x, 且A>0,B>0 。

1、在命令行输入数据:
》x=;
》y=;
2、启动曲线拟合工具箱
》cftool
3、进入曲线拟合工具箱界面“Curve Fitting tool”
(1)点击“Data”按钮,弹出“Data”窗口;
(2)利用X data和Y data的下拉菜单读入数据x,y,可修改数据集名“Data set name”,然后点击“Create data set”按钮,退出“Data”窗口,返回工具箱界面,这时会自动画出数据集的曲线图;
(3)点击“Fitting”按钮,弹出“Fitting”窗口;
(4)点击“New fit”按钮,可修改拟合项目名称“Fit name”,通过“Data set”下拉菜单选择数据集,然后通过下拉菜单“Type of fit”选择拟合曲线的类型,工具箱提供的拟合类型有:

[*]Custom Equations:用户自定义的函数类型
[*]Exponential:指数逼近,有2种类型, a*exp(b*x) 、 a*exp(b*x) + c*exp(d*x)
[*]Fourier:傅立叶逼近,有7种类型,基础型是 a0 + a1*cos(x*w) + b1*sin(x*w)
[*]Gaussian:高斯逼近,有8种类型,基础型是 a1*exp(-((x-b1)/c1)^2)
[*]Interpolant:插值逼近,有4种类型,linear、nearest neighbor、cubic spline、shape-preserving
[*]Polynomial:多形式逼近,有9种类型,linear ~、quadratic ~、cubic ~、4-9th degree ~
[*]Power:幂逼近,有2种类型,a*x^b 、a*x^b + c
[*]Rational:有理数逼近,分子、分母共有的类型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子还包括constant型
[*]Smoothing Spline:平滑逼近(翻译的不大恰当,不好意思)
[*]Sum of Sin Functions:正弦曲线逼近,有8种类型,基础型是 a1*sin(b1*x + c1)
[*]Weibull:只有一种,a*b*x^(b-1)*exp(-a*x^b)

选择好所需的拟合曲线类型及其子类型,并进行相关设置:
——如果是非自定义的类型,根据实际需要点击“Fit options”按钮,设置拟合算法、修改待估计参数的上下限等参数;
——如果选Custom Equations,点击“New”按钮,弹出自定义函数等式窗口,有“Linear Equations线性等式”和“General Equations构造等式”两种标签。
在本例中选Custom Equations,点击“New”按钮,选择“General Equations”标签,输入函数类型y=a*x*x + b*x,设置参数a、b的上下限,然后点击OK。
(5)类型设置完成后,点击“Apply”按钮,就可以在Results框中得到拟合结果,如下例:
general model:
f(x) = a*x*x+b*x

Coefficients (with 95% confidence bounds):
a = 0.009194 (0.009019, 0.00937)
b = 1.78e-011 (fixed at bound)

Goodness of fit:
SSE: 6.146
R-square: 0.997
Adjusted R-square: 0.997
RMSE: 0.8263

同时,也会在工具箱窗口中显示拟合曲线。
这样,就完成一次曲线拟合啦,十分方便快捷。当然,如果你觉得拟合效果不好,还可以在“Fitting”窗口点击“New fit”按钮,按照步骤(4)~(5)进行一次新的拟合。
不过,需要注意的是,cftool 工具箱只能进行单个变量的曲线拟合,即待拟合的公式中,变量只能有一个。对于混合型的曲线,例如 y = a*x + b/x ,工具箱的拟合效果并不好。下一篇文章我介绍帮同学做的一个非线性函数的曲线拟合。

jinzi2006 发表于 2008-11-11 14:26:27

用lsqcurvefit拟合,首先编写M-fun:
function y=xishu(a,x)
y=0.2997*exp[(x/10^(a(2)+a(3)a(6)))^a(4)
分别付给q0值(最好定义为全局变量),
命令窗口调用 a=lsqcurve(‘xishu’,,x,y);a
得到a的系数,那么拟合表达式显然

liqifu 发表于 2008-11-14 08:57:29

呵呵,三楼的办法若是一组数据的变量拟合还是可以的;:P 但是是要找到的表达式要拟合几组数据啊,并且都要比较好;所以,必须进行优化处理。:P

:handshake :handshake :handshake

ilxy 发表于 2008-11-23 21:46:26

1stopt可以对针对不同的数据组来拟合,不过你没有给出原始的数据,我也帮不上你

shamohu 发表于 2008-11-24 11:58:00

他的数据是通过OLE镶在Word文档里的,如果安装有Origin,双击图即可启动Origin并得到数据。建议下次以文本形式上传数据为好。

在1stOpt中,可通过关键字“VarConstant”来表达不同状况下的初值q0,大概代码如下,因为数据太长了,LZ可以自己试试。

VarConstant q0=;
Parameter a,b,c,m,n,q;
Variable x,y;
StartProgram ;
Procedure MainModel;
var j: integer;
Begin
   for j := 0 to DataLength - 1 do
      y := 0.2997*(1+a*power((q0-q),n))*exp(power((x/power(10,(b+c*q))),m));
End;
EndProgram;
Data "1";
1      0.378
55.2      0.40933
....
Data "2";
1      0.35091
55.2      0.37455
....
Data "3";
...
Data "4";
...
Data "5";
...

[ 本帖最后由 shamohu 于 2008-11-24 11:59 编辑 ]

burne 发表于 2008-11-24 14:02:17

我也有一个非常类似的问题
因为现在matlab里面的遗传算法做的很方便,所以就用它做了一下,也是不稳定,每次算出来的结果都差挺多的
同时也不知道怎么改那些参数才能让结果更准?
还试过pattern search,不设限制,结果很好,但是不符合物理意义,
不过你可以试一下

ilxy 发表于 2008-11-25 15:08:46

用1stopt试了一下,对于1stopt的具体的内部的优化算法,我也不是很精通。

Parameter a,b,c,m,n,q;
Variable x1,y1,x2,y2,x3,y3,x4,y4,x5,y5;
StartProgram ;
Procedure MainModel;
var j: integer;
Begin
   for j := 0 to DataLength - 1 dobegin
      y1 := 0.2997*(1+a*power((30-q),n))*exp(power((x1/power(10,(b+c*q))),m));
      y2 := 0.2997*(1+a*power((22-q),n))*exp(power((x2/power(10,(b+c*q))),m));
      y3 := 0.2997*(1+a*power((26-q),n))*exp(power((x3/power(10,(b+c*q))),m));
      y4 := 0.2997*(1+a*power((14-q),n))*exp(power((x4/power(10,(b+c*q))),m));
      y5 := 0.2997*(1+a*power((18-q),n))*exp(power((x5/power(10,(b+c*q))),m));
   END;
            
End;
EndProgram;
datafile "codesheet1";


迭代数: 10
计算用时(时:分:秒:微秒): 00:08:15:203
优化算法: 麦夸特法(Levenberg-Marquardt) + 通用全局优化法
计算结束原因: 用户中止
均方差(RMSE): 0.00760640161872056
残差平方和(SSE): 0.413969307662641
相关系数(R): 0.999991841306815
相关系数之平方(R^2): 0.999983682680194
决定系数(DC): 0.999983676502282
F统计(F-Statistic): 4564.01194275849

参数                  最佳估算
--------------------      -------------
a                  0.000636696324481094
b                  -50.6658971387075
c                  9.1022387989912
m                  0.34799857776093
n                  2.05695477996551
q                  6.13611571761599

[ 本帖最后由 ilxy 于 2008-11-25 15:10 编辑 ]

liqifu 发表于 2008-12-4 10:47:34

原帖由 burne 于 2008-11-24 14:02 发表 http://forum.simwe.com/images/common/back.gif
我也有一个非常类似的问题
因为现在matlab里面的遗传算法做的很方便,所以就用它做了一下,也是不稳定,每次算出来的结果都差挺多的
同时也不知道怎么改那些参数才能让结果更准?
还试过pattern search,不设限制 ...

每次算出来的结果都差挺多的

呵呵,不会吧?我计算的也有些偏差,呵呵,把结果带入进去 ,与原图像比较就知道那个拟合好了啊!呵呵,我就是计算出结果比较下,然后带入比较图形就可以了。

burne 发表于 2008-12-4 16:13:04

我可以找到两组数,代入公式,得到结果都非常好。
但这两组数可以差很多!

akjuan 发表于 2008-12-4 17:21:13

这个问题可以纳入多目标规划的范围,根本无法达到每条线都能拟合很好的精度,最好的办法是寻找一组非劣解,从中寻找误差最小的

上面几位用1stopt拟合的参数,你可以代入原方程,或者绘图看一下,相差太大了,结果根本是不能用的

我采用遗传算法以及多目标规划的pareto方法,拟合出一组比较合适的结果,这组应该是比较优良的拟合结果了,欢迎大家讨论

-0.2694    0.4922    0.2833   -0.0551    0.7759    0.0517

8lu 发表于 2008-12-6 06:27:20

太好了,本人新手,刚刚接触到一个很类似的问题,想在这里和大家讨论讨论,在这里有几个问题我还不是很清楚,我是要做一个对模态参数的优化问题,利用最小二乘法原则,也即是模态分析后用得到各个模态的固有频率,与试验量结果比较,寻找最小误差平方和(min E = Σ(f1-f2 )^2 ,其中f1模态分析得到的数据,同样也有五个参数x1-5,f2是实验数据)。对于这类问题的思路很不清楚,一个是:先利用最小二乘求得一个拟合函数,然后将他作为目标函数利用遗传算法对其优化找出最优解,以及对应参数值;还是直接利用某种算法直接寻找”min E = Σ(f1-f2 )^2“的解。思路很不清楚。希望各位能指教一二:D
页: [1]
查看完整版本: 非线性拟合(多目标规划的pareto方法)