找回密码
 欢迎注册
查看: 10552|回复: 6

[原创] Forcal全局优化库FcOpt更新

[复制链接]
发表于 2011-2-8 17:07:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
Forcal优化库FcOpt最近进行了更新,全局优化能力显著增强,使用更加方便,同时增加了隐函数全部解,非线性方程(组)全部解求解函数,更新了微分方程参数优化(拟合)实例。

参考:http://www.forcal.net/sysm/forcal9/fchtm/fcopt.htm

期待大家也发布自己的算法库,呵呵。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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代码:
  1. !using["fcopt","math"];
  2. init(::Array,max)= //准备数据
  3. {
  4.     max=19,
  5.     Array=arrayinit{2,max,2 :
  6.         0,         0.928,
  7.         0.0000098, 1.02,
  8.         0.0000195, 1.12,
  9.         0.0000293, 1.25,
  10.         0.0000391, 1.42,
  11.         0.0000488, 1.7,
  12.         0.0000586, 2.01,
  13.         0.0000684, 2.26,
  14.         0.0000781, 2.46,
  15.         0.0000879, 2.63,
  16.         0.0000977, 2.82,
  17.         0.0001074, 3.01,
  18.         0.0001172, 3.2,
  19.         0.000127,  3.41,
  20.         0.0001367, 3.59,
  21.         0.0001465, 3.72,
  22.         0.0001562, 3.85,
  23.         0.000166,  3.98,
  24.         0.0001758, 4.08
  25.     }.free()
  26. };
  27. f(p1,p2,p3,p4,p5 : i,s,x,y : Array,max)= //目标函数
  28. {
  29.     s=0,i=0,(i<max).while{
  30.         x=Array[i,0], y=Array[i,1],
  31.         s=s+[(p1)+(p2*exp(-p3*x/p5)+p4/(1+p4*p5*x))-y]^2,
  32.         i++
  33.     },
  34.     sqrt[s/max]
  35. };
  36. Opt[HFor("f"), optwaysimdeep, optwayconfra, optdeep,50]; //比较难的优化,我就这样使用Opt函数
复制代码
结果(需求解几次,前面的数是最优参数,最后一个数是目标函数值):

6.855486033798995 4.813449005068769 -54298054.6899329 -10.72898361613976 -1516.502649185066 3.337716353170544e-002

感觉做这个优化题,是稍稍有些难度的,换句话说,如果题目难度不超过此题,Forcal可以轻松求解。

喜欢优化的朋友可以尝试一下。

目前我知道1stOpt可以轻松求解此题,还有一位优化高手也可以轻松求解此题,还想知道更多可以求解此题的朋友或软件。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-21 19:27:55 | 显示全部楼层
x太小, 把x放大10000倍,再进行拟合,用最普通的算法即可。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-2-21 20:37:11 | 显示全部楼层
x太小, 把x放大10000倍,再进行拟合,用最普通的算法即可。
wayne 发表于 2011-2-21 19:27

看过wayne 解1stOpt九道优化题第一题的巧妙算法,印象很深刻,现在妙法再现,呵呵。

不知试过其他题没有?解这种有难度的题,不管是否解出,都是一种快乐。

对这种题,高手可以做,不深究此道的人借助好的算法或软件也可以做。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-2-21 20:55:55 | 显示全部楼层
再借助一题,网出更多高人:

min = (x1^x2+x2^x1-5*x1*x2*x3-85)^2+(x1^3*x2^x3*x3^x2-60)^2+(x1^x3+x3^x1-x2-0.55)^2

求min 的最小值?

链接我就不给出了,虽然可以搜到此题的正解,但有兴趣者还是先试一下。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2011-2-21 20:56:16 | 显示全部楼层
4# forcal
是说 这上面的第5小节“非线性拟合测试题”的 9道题吗?
http://www.7d-soft.com/cn/Regression_Test.htm

我没试过
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2011-2-21 20:59:51 | 显示全部楼层
4# forcal
是说 这上面的第5小节“非线性拟合测试题”的 9道题吗?
http://www.7d-soft.com/cn/Regression_Test.htm

我没试过
wayne 发表于 2011-2-21 20:56

是这9道题,有空可试一下,很有挑战性。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-20 03:48 , Processed in 0.043896 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表