forcal 发表于 2011-2-8 17:07:30

Forcal全局优化库FcOpt更新

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

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

期待大家也发布自己的算法库,呵呵。

forcal 发表于 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, y=Array,
      s=s+[(p1)+(p2*exp(-p3*x/p5)+p4/(1+p4*p5*x))-y]^2,
      i++
    },
    sqrt
};
Opt; //比较难的优化,我就这样使用Opt函数结果(需求解几次,前面的数是最优参数,最后一个数是目标函数值):

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

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

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

目前我知道1stOpt可以轻松求解此题,还有一位优化高手也可以轻松求解此题,还想知道更多可以求解此题的朋友或软件。

wayne 发表于 2011-2-21 19:27:55

x太小, 把x放大10000倍,再进行拟合,用最普通的算法即可。

forcal 发表于 2011-2-21 20:37:11

x太小, 把x放大10000倍,再进行拟合,用最普通的算法即可。
wayne 发表于 2011-2-21 19:27 http://bbs.emath.ac.cn/images/common/back.gif
看过wayne 解1stOpt九道优化题第一题的巧妙算法,印象很深刻,现在妙法再现,呵呵。

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

对这种题,高手可以做,不深究此道的人借助好的算法或软件也可以做。

forcal 发表于 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 的最小值?

链接我就不给出了,虽然可以搜到此题的正解,但有兴趣者还是先试一下。

wayne 发表于 2011-2-21 20:56:16

4# forcal
是说 这上面的第5小节“非线性拟合测试题”的 9道题吗?
http://www.7d-soft.com/cn/Regression_Test.htm

我没试过

forcal 发表于 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 http://bbs.emath.ac.cn/images/common/back.gif
是这9道题,有空可试一下,很有挑战性。
页: [1]
查看完整版本: Forcal全局优化库FcOpt更新