- 注册时间
- 2010-7-23
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 851
- 在线时间
- 小时
|
楼主 |
发表于 2011-2-20 19:14:17
|
显示全部楼层
使用Forcal优化库FcOpt做优化时,无论简单的优化,还是复杂的优化(例如含积分的优化、共享参数优化、复数优化、微分方程参数优化等等),基本步骤都是一样的:
1、给出拟合数据,一般保存在数组中。如果没有数据,这一步就省了。
2、编写目标函数,做优化时就是要得到目标函数值最小时的最优参数值。自己写目标函数,似乎是麻烦了些,但非常灵活,前面提到的各种各样的优化都可以通过自己写目标函数来实现。正所谓以不变应万变也。
3、选择优化函数进行优化。
在FcOpt中,我最喜欢用的优化函数是Opt,下面给出一个使用Opt做优化的例子:
例子:拟合公式:y = (p1)+(p2*exp(-p3*x/p5)+p4/(1+p4*p5*x))
p1,p2,p3,p4,p5为待求参数
数据(x, y)
0, 0.928
0.0000098, 1.02
0.0000195, 1.12
0.0000293, 1.25
0.0000391, 1.42
0.0000488, 1.7
0.0000586, 2.01
0.0000684, 2.26
0.0000781, 2.46
0.0000879, 2.63
0.0000977, 2.82
0.0001074, 3.01
0.0001172, 3.2
0.000127, 3.41
0.0001367, 3.59
0.0001465, 3.72
0.0001562, 3.85
0.000166, 3.98
0.0001758, 4.08
Forcal代码:- !using["fcopt","math"];
- init(::Array,max)= //准备数据
- {
- max=19,
- Array=arrayinit{2,max,2 :
- 0, 0.928,
- 0.0000098, 1.02,
- 0.0000195, 1.12,
- 0.0000293, 1.25,
- 0.0000391, 1.42,
- 0.0000488, 1.7,
- 0.0000586, 2.01,
- 0.0000684, 2.26,
- 0.0000781, 2.46,
- 0.0000879, 2.63,
- 0.0000977, 2.82,
- 0.0001074, 3.01,
- 0.0001172, 3.2,
- 0.000127, 3.41,
- 0.0001367, 3.59,
- 0.0001465, 3.72,
- 0.0001562, 3.85,
- 0.000166, 3.98,
- 0.0001758, 4.08
- }.free()
- };
- f(p1,p2,p3,p4,p5 : i,s,x,y : Array,max)= //目标函数
- {
- s=0,i=0,(i<max).while{
- x=Array[i,0], y=Array[i,1],
- s=s+[(p1)+(p2*exp(-p3*x/p5)+p4/(1+p4*p5*x))-y]^2,
- i++
- },
- sqrt[s/max]
- };
- Opt[HFor("f"), optwaysimdeep, optwayconfra, optdeep,50]; //比较难的优化,我就这样使用Opt函数
复制代码 结果(需求解几次,前面的数是最优参数,最后一个数是目标函数值):
6.855486033798995 4.813449005068769 -54298054.6899329 -10.72898361613976 -1516.502649185066 3.337716353170544e-002
感觉做这个优化题,是稍稍有些难度的,换句话说,如果题目难度不超过此题,Forcal可以轻松求解。
喜欢优化的朋友可以尝试一下。
目前我知道1stOpt可以轻松求解此题,还有一位优化高手也可以轻松求解此题,还想知道更多可以求解此题的朋友或软件。 |
|