- 积分
- 7
- 注册时间
- 2002-9-10
- 仿真币
-
- 最后登录
- 1970-1-1
|
楼主 |
发表于 2011-2-15 16:28:31
|
显示全部楼层
来自 山东淄博
另外,将公式改为:y = a*(x-d)^4+b*(x-d)^p2+c,还是用一楼的Forcal代码,结果大概是:
[a,b,c,d,p2] = 48591.8741934397 -6.374606769898301e-017 18.75746239720849 -3.234708294999146e-003 ...
shamohu 发表于 2011-2-15 15:37
指数计算我用的是C++的pow函数,是不是p2=7.524779375888238e+017,指数太大了,pow就返回一个默认值,验证了一下:
(-0.08+3.234708294999146e-003)^7.524779375888238e+017 = 0
增加了p2后,拟合难度增加了,故修改代码如下:
- !using["fcopt","math"];
- init(::Array,max)=
- {
- max=11,
- Array=arrayinitns{max,2 :
- "-0.08 20.26008
- -0.065 19.72613
- -0.05 19.501619
- -0.03 18.72662
- -0.015 18.58769
- 0.015 18.592199
- 0.03 18.88372
- 0.05 19.5453
- 0.065 19.88743
- 0.08 20.9914
- 0 18.12336"
- }.free()
- };
- f(a, b, c, d, p2 :i,s,x,y:Array,max)=
- {
- s=0,i=0,(i<max).while{
- x=Array[i,0], y=Array[i,1],
- s=s+[ a*(x-d)^4+b*(x-d)^p2+c-y]^2,
- i++
- },
- s
- };
- Opt[HFor("f"), optmax,300, optwaysimdeep, optwayconfra];
复制代码
运行几次后可得解:
421.4346987551445 -168.2006461102398 35.76126549040257 -0.4467645916460592 1.981167282514616 0.2619657217171444
若使用以下代码,缩小搜索范围,可以一半以上的概率获得结果:
- !using["fcopt","math"];
- init(::Array,max)=
- {
- max=11,
- Array=arrayinitns{max,2 :
- "-0.08 20.26008
- -0.065 19.72613
- -0.05 19.501619
- -0.03 18.72662
- -0.015 18.58769
- 0.015 18.592199
- 0.03 18.88372
- 0.05 19.5453
- 0.065 19.88743
- 0.08 20.9914
- 0 18.12336"
- }.free()
- };
- f(a, b, c, d, p2 :i,s,x,y:Array,max)=
- {
- s=0,i=0,(i<max).while{
- x=Array[i,0], y=Array[i,1],
- s=s+[ a*(x-d)^4+b*(x-d)^p2+c-y]^2,
- i++
- },
- s
- };
- Opt[HFor("f"), optwaysimdeep, optwayconfra, optrange,-1e10,1e10,-1e10,1e10,-1e10,1e10,-1e10,1e10,-1e10,1e10];
复制代码
结果:
421.4345728315115 -168.2007599061191 35.7612703620313 -0.4467647520367266 1.981168132343698 0.2619657217171494
不知1stOpt最优结果如何? |
|