zhengfei_dlut 发表于 2006-4-1 09:57:57

"曲线拟合——奖励10分"的解答

用 Matlab Curve Fitting Toolbox 得到的结果

General model:
       f(x) = a*(1-w/r1*x)*exp(-r1*x)+b*(1-w/r2*x)*exp(-r2*x)+0.07*(w/x)
Coefficients (with 95% confidence bounds):
       a =       7.651(7.357, 7.945)
       b =      0.4209(0.4013, 0.4405)
       r1 =       5.793(5.714, 5.871)
       r2 =       2.028(1.996, 2.061)
       w =      0.1054(0.1017, 0.109)

Goodness of fit:
SSE: 1.24e-006
R-square: 1
Adjusted R-square: 1
RMSE: 0.0001071

zhengfei_dlut 发表于 2006-4-1 10:02:49

Re:"曲线拟合——奖励10分"的解答

在Matlab中输入

x=0.75:0.02:3;
y=0.0829./x.^3;

生成数据

输入 cftool 命令打开 Curve Fitting Tool 界面

点击Data按钮导入生成的数据 x y

zhengfei_dlut 发表于 2006-4-1 10:06:43

Re:"曲线拟合——奖励10分"的解答

点击 Fitting按钮打开Fitting面板

zhengfei_dlut 发表于 2006-4-1 10:10:06

Re:"曲线拟合——奖励10分"的解答

点击 New equation 按钮 输入你想要的表达式

注意要在 Generalequation 面板输入

a*(1-w/r1*x)*exp(-r1*x)+b*(1-w/r2*x)*exp(-r2*x)+0.07*(w/x)

最后点击Apply按钮就行了可以得到结果

也不知道是否正确 仅供参考

pengjx7171 发表于 2006-4-1 23:00:03

Re:"曲线拟合——奖励10分"的解答

Origin里面也可以做,叫nonlinear curve fitting

iomega 发表于 2006-4-2 00:20:51

Re:"曲线拟合——奖励10分"的解答

好多软件都有curve fitting的函数,在这里我只是想针对这个问题介绍一下curve fitting的原理 -- 如何自己编写fitting 程序。

假设有一套试验数据:{x_i,y_i}, i=1..N. 有一目标函数y( x )=f(x,a,b,c),想通过fitting{x_i,y_i}获得a,b,c的值。可以认为是要找出(a,b,c)使得sum[ (f(x_i,a,b,c)- y_i)^2] 最小.这就是所谓的least square fitting.

令F(a,b,c)=sum[ (f(x_i,a,b,c)- y_i)^2] , i=1..N
使F(a,b,c)的值最小,其实就是要让 dF(a,b,c)/da=0, dF(a,b,c)/db=0, dF(a,b,c)/dc=0.
问题最后退化为解一个非线性方程组:
dF(a,b,c)/da=0
dF(a,b,c)/db=0
dF(a,b,c)/dc=0
求出a,b,c的值。

我在这里附上了用mathcad写的一段程序,用牛顿迭代法解你所提出的问题。其中没有用到任何特殊的数学函数,可以很容易的改写成其他语言,例如C,fortran等。

这段程序的优点是可以fit任何模型,可以不需要有形式解。例如y( x )=f(x,a,b,c). f可以是有限元ansys的解 -》给定热物理参数a,b,c的结构上不同x点的温度值。假设每点的值可以用试验测出来,那么可以通过程序fit出a,b,c的值。

另外对与楼上所提出的模型y(A,B,R1,R2,omega),其实有无穷多的fitting结果。所以如何选择合适的fitting参数,待猜初始值和数目是很重要的。这是数学上的问题,不在这里讨论。

iomega 发表于 2006-4-2 00:31:24

Re:"曲线拟合——奖励10分"的解答

附上mathcad的原程序。mathcad是一个很好的数学计算工具,对于一般问题写代码时间要比matlab快的多,而且运算时间和matlab一样慢,呵呵。特点是直观易懂,也可以写很复杂的程序。我一般都是先用mathca实现问题,然后再改写成C代码,提高运算速度.

cucral 发表于 2006-4-2 14:47:10

Re:"曲线拟合——奖励10分"的解答

谢谢几位的指点。
我主要是想拟合JWL状态方程的参数,本版有很多版友问过这个问题。我想这次写个教程,把问题彻底解决了。
由于以前有版友说,需要用 非线性规划或遗传算法。我以为拟合JWL的参数会很难,因为以前一直以为matalab等软件只能拟合简单的多项式的参数,没想到也能拟合复杂函数的参数。
呵呵,不过我答应过的加分,一定会兑现的。我知道上面的几位不是新人,绝不是为了加分而来,所以想等问题彻底解决了再说。

现在的问题是:
目标函数,需要在x=0.75这一点,等于原函数。
不知道有什么方法可以保证啊?

cucral 发表于 2006-4-2 14:58:51

Re:"曲线拟合——奖励10分"的解答

我按照zhengfei_dlut的方法,做了一下。
单就这道题而言,虽然x=0.75处拟合的不太好,但能满足应用。
不过对于别的初函数,在x=0.75处,两个函数拟合的不好。

不知道有没有别的方法能满足下面的要求:
x=0.75处,两个函数值相等。
x在0.75~1 之间尽量拟合的精确, x在1~3之间可以粗糙一些。

还请 zhengfei_dlut,pengjx7171,iomega多多指点!
谢谢

iomega 发表于 2006-4-2 15:34:34

Re:"曲线拟合——奖励10分"的解答

呵呵,斑竹提出的问题,正是我写这个fitting程序的本意。回答这些问题,光靠知道怎么用matlab,origin等软件里的non-linear fitting function是不够的 - 必须要对fitting算法理解才行。我主要是做实验测量材料属性参数的。用的模型一般都是很复杂的,有时甚至是没有表达式解的,例如有限元模型。在这种情况下,一般数学软件提供的fitting function是无法用来fit参数的,只有自己写程序。我不是专门搞数值计算的 - 我上面举的例子是based on一般常用的非线性迭代法的least square fitting.我的理解是如果fitting是基于迭代法的,那么无法保证在x=0.75这一点,等于原函数。欢迎专门研究数值计算的高手指正。

(2) x在0.75~1 之间尽量拟合的精确, x 在1~3之间可以粗糙一些。

-----------------------》可以在0.75~1取更加密的数值点,而在1-3中少取点。

cucral 发表于 2006-4-3 21:13:05

Re:"曲线拟合——奖励10分"的解答

今天自己整理了一下,问题终于解决了。
由于无法在x=0.75处,保证两个函数值相等。结果不够完美。
所以只给zhengfei_dlut加了6分,不要说我吝啬啊!:-)
感谢iomega对fitting算法的详细讲解,受益匪浅!

另外特别感谢bainhome,在Matlab版回复的帖子中。
详细介绍了如何用1stOpt来拟合曲线。

个人感觉1stOpt最适合。

我另外整理了一篇小文章“炸药JWL状态方程的参数拟合”
希望对做爆炸力学的朋友有所帮助!

再次感谢zhengfei_dlutiomegabainhome
欢迎常来dyna版。

FreddyMusic 发表于 2006-4-4 15:37:48

Re:"曲线拟合——奖励10分"的解答

http://www.simwe.com/forum/viewthread.php?tid=710485

simwe 人才济济, cucral 最近收获不少嘛?:D

cucral 发表于 2006-4-4 18:50:45

Re:"曲线拟合——奖励10分"的解答

呵呵,确实啊。
感觉自己的基础太差了啊!
最近做炸药触地爆轰问题,冲击波在空气中衰减的太快了。
我看了以前的帖子,大家都遇到这个毛病了,不知道有没有人解决啊!
唉,想真正的彻底的解决一个问题,不容易啊!

huangfei 发表于 2006-4-4 19:16:41

Re:"曲线拟合——奖励10分"的解答

"呵呵,确实啊。
感觉自己的基础太差了啊!
最近做炸药触地爆轰问题,冲击波在空气中衰减的太快了。
我看了以前的帖子,大家都遇到这个毛病了,不知道有没有人解决啊!
唉,想真正的彻底的解决一个问题,不容易啊!"

数值模拟软件本身(简化,算法,数值方法等本身误差)就有很多不完善的地方,就爆轰模拟而言,估计没有什么软件能达到和理论和试验完全一致,所以,也不必要对数值模拟软件过分依赖,非要追求和理论一致。一些问题定性分析就很不错了。如JWL方程,该方程就不考虑爆轰反应过程,

quantumlike 发表于 2006-4-5 10:08:18

Re:"曲线拟合——奖励10分"的解答

1stOpt是什么?谢谢!

jelly 发表于 2006-5-7 10:09:13

在original中可以进行非线性拟合

akjuan 发表于 2006-8-2 16:21:59

给你一个完美点的

曲线拟合是否良好,是有很多参数判别的。
以下应该是你需要比较良好的拟合了。
1、在x=0.75处,原函数值为0.19650370370370
   拟合f(xi)为0.196502
2、下面给出了拟合后各点的函数值
3、给出了拟合参数及区间估计
4、拟合优度参数
5、拟合曲线及残差曲线

model:
f(x) = a*(1-b/c*x)*exp(-c*x)+d*(1-b/e*x)*exp(-e*x)+0.07*b/x

Coefficients (with 99% confidence bounds):
      a=A =      7.148(6.349, 7.946)
       b =w =      0.7323(0.277, 1.188)
       c =R1=      5.368(5.177, 5.559)
       d =B =      0.08271(0.007398, 0.158)
       e =R2=      0.7809(0.6461, 0.9156)

拟合优度参数:
SSE: 7.122e-005
R-square: 0.9998
Adjusted R-square: 0.9998
RMSE: 0.0005677

xi      f(xi)
0.75        0.196502
0.76        0.188919
0.77        0.181697
0.78        0.174817
0.79        0.168261
0.8        0.162013
0.81        0.156057
0.82        0.150378
0.83        0.144962
0.84        0.139795
0.85        0.134864
0.86        0.130158
0.87        0.125664
0.88        0.121373
0.89        0.117274
0.9        0.113356
0.91        0.109612
0.92        0.106032
0.93        0.102608
0.94        0.0993319
0.95        0.0961968
0.96        0.0931954
0.97        0.0903211
0.98        0.0875675
0.99        0.0849288
   1        0.0823992
1.01        0.0799735
1.02        0.0776464
1.03        0.0754132
1.04        0.0732693
1.05        0.0712105
1.06        0.0692325
1.07        0.0673315
1.08        0.0655039
1.09        0.0637461
1.1        0.0620547
1.11        0.0604267
1.12        0.0588591
1.13        0.0573491
1.14        0.0558939
1.15        0.054491
1.16        0.053138
1.17        0.0518327
1.18        0.0505727
1.19        0.0493562
1.2        0.048181
1.21        0.0470455
1.22        0.0459477
1.23        0.044886
1.24        0.0438589
1.25        0.0428648
1.26        0.0419022
1.27        0.0409699
1.28        0.0400666
1.29        0.0391909
1.3        0.0383417
1.31        0.037518
1.32        0.0367187
1.33        0.0359427
1.34        0.0351891
1.35        0.034457
1.36        0.0337456
1.37        0.033054
1.38        0.0323814
1.39        0.0317271
1.4        0.0310904
1.41        0.0304706
1.42        0.0298671
1.43        0.0292793
1.44        0.0287065
1.45        0.0281483
1.46        0.0276041
1.47        0.0270733
1.48        0.0265556
1.49        0.0260505
1.5        0.0255575
1.51        0.0250761
1.52        0.0246061
1.53        0.0241471
1.54        0.0236985
1.55        0.0232603
1.56        0.0228319
1.57        0.0224131
1.58        0.0220035
1.59        0.021603
1.6        0.0212111
1.61        0.0208277
1.62        0.0204525
1.63        0.0200852
1.64        0.0197257
1.65        0.0193737
1.66        0.0190289
1.67        0.0186912
1.68        0.0183604
1.69        0.0180363
1.7        0.0177187
1.71        0.0174074
1.72        0.0171024
1.73        0.0168033
1.74        0.0165101
1.75        0.0162226
1.76        0.0159406
1.77        0.0156642
1.78        0.015393
1.79        0.0151269
1.8        0.014866
1.81        0.0146099
1.82        0.0143587
1.83        0.0141122
1.84        0.0138703
1.85        0.0136329
1.86        0.0133999
1.87        0.0131712
1.88        0.0129467
1.89        0.0127263
1.9        0.01251
1.91        0.0122977
1.92        0.0120892
1.93        0.0118845
1.94        0.0116835
1.95        0.0114862
1.96        0.0112924
1.97        0.0111021
1.98        0.0109153
1.99        0.0107319
   2        0.0105517
2.01        0.0103748
2.02        0.0102011
2.03        0.0100305
2.04        0.00986301
2.05        0.0096985
2.06        0.00953696
2.07        0.00937832
2.08        0.00922253
2.09        0.00906955
2.1        0.00891933
2.11        0.00877181
2.12        0.00862696
2.13        0.00848473
2.14        0.00834507
2.15        0.00820793
2.16        0.00807329
2.17        0.00794109
2.18        0.00781129
2.19        0.00768387
2.2        0.00755877
2.21        0.00743595
2.22        0.00731539
2.23        0.00719705
2.24        0.00708089
2.25        0.00696687
2.26        0.00685496
2.27        0.00674514
2.28        0.00663735
2.29        0.00653158
2.3        0.00642779
2.31        0.00632596
2.32        0.00622604
2.33        0.00612801
2.34        0.00603185
2.35        0.00593751
2.36        0.00584499
2.37        0.00575423
2.38        0.00566523
2.39        0.00557795
2.4        0.00549237
2.41        0.00540845
2.42        0.00532619
2.43        0.00524554
2.44        0.00516649
2.45        0.00508901
2.46        0.00501308
2.47        0.00493867
2.48        0.00486576
2.49        0.00479434
2.5        0.00472437
2.51        0.00465583
2.52        0.00458871
2.53        0.00452298
2.54        0.00445863
2.55        0.00439562
2.56        0.00433394
2.57        0.00427358
2.58        0.0042145
2.59        0.0041567
2.6        0.00410015
2.61        0.00404483
2.62        0.00399073
2.63        0.00393783
2.64        0.0038861
2.65        0.00383554
2.66        0.00378612
2.67        0.00373783
2.68        0.00369065
2.69        0.00364456
2.7        0.00359955
2.71        0.0035556
2.72        0.00351269
2.73        0.00347081
2.74        0.00342995
2.75        0.00339008
2.76        0.0033512
2.77        0.00331329
2.78        0.00327633
2.79        0.00324031
2.8        0.00320521
2.81        0.00317102
2.82        0.00313774
2.83        0.00310533
2.84        0.00307379
2.85        0.00304311
2.86        0.00301328
2.87        0.00298427
2.88        0.00295608
2.89        0.0029287
2.9        0.00290211
2.91        0.0028763
2.92        0.00285125
2.93        0.00282697
2.94        0.00280342
2.95        0.00278061
2.96        0.00275853
2.97        0.00273715
2.98        0.00271647
2.99        0.00269648
   3        0.00267716

akjuan 发表于 2006-8-2 18:05:47

步骤可以参考
楼上zhengfei_dlut所说

为了保证在x=0.75处与原函数相等
需要在fit option
中修改参数取植范围

kook110 发表于 2006-8-2 19:00:27

也说上几句,说的不好,还望pp了。
以前用的时候,主要是使用,后来也发现了这样的问题。
自己就想了很久,觉的 huangfei讲的很有道理,谁能够保证 0.75是个准确反映实际的数据呢?所以有的时候,精度足够就ok,
但是对于精度的保证,我印象中记的在matlab中进行曲线拟和的时候可以赋予某些数据“权重”,但是一般自己不用那些东西。顾而提醒一下,回去自己在看看~~
出来乍到,还望各位海涵~~

glx 发表于 2006-9-26 22:35:31

有没有用傅立叶级数拟合的例子?
页: [1] 2
查看完整版本: "曲线拟合——奖励10分"的解答