歡迎訪問 Lu程序設計

Lu參數優化動態庫LuOpt V1.0

目  錄

1 什么是LuOpt

2 Lu優化函數

luopt::Opt 求無約束或約束條件下的n維極小值 無約束優化能力極強,約束優化能力弱,速度快。隨機生成初值,全局優化,解不穩定。
3 優化實例
3.1 較難的例子 選自網上的難題例子  
3.2 非線性擬合測試題 選自1stOpt的九道測試題  
3.3 微分方程參數優化(擬合) 選自網上實例  
3.4 求解NIST非線性測試題 NIST 27 道非線性擬合測試題  
4 求方程(組)的全部解
luopt::iFind 求單變量方程(隱函數)的全部解 求解能力強,解是穩定的。
luopt::Find 求方程組的全部解 求解能力強,解不穩定。
5 注冊    
luopt::OptPassword 獲取機器碼,免費注冊后使用LuOpt的全部功能 已取消免費注冊,可直接使用LuOpt的全部功能。

1 什么是LuOpt [返回頁首]

    LuOpt64.dll是一個Lu參數優化動態庫,主要包含一些參數優化函數和解方程函數。

    在LuOpt中的函數是通過二級函數命名空間“luopt”輸出的,所有函數均具有類似“luopt::Opt(...)”的格式。使用!!!using("luopt");可簡化LuOpt中的函數訪問。

    免費注冊說明:為了演示設計商業性Lu擴展動態庫的可行性,LuOpt設計成須注冊后使用其全部功能。如果沒有注冊,當優化參數多于2個時,Opt函數僅返回最小值,不能返回優化參數。目前免費注冊,用函數luopt::OptPassword獲取機器碼后,通過E-mail發送到[email protected]獲取注冊碼 (已取消免費注冊,可直接使用LuOpt的全部功能)。

    函數OptPassword的格式(返回值及參數pw1,pw1,... ...,pwn將返回多個機器碼):luopt::OptPassword(&pw1,&pw1,... ...,&pwn)

    函數OptPassword的用法1:luopt::OptPassword();

    函數OptPassword的用法2:(:pw)=luopt::OptPassword(&pw),pw;

    函數OptPassword的用法3:(:pw)=luopt::OptPassword(0,&pw),pw;

    獲取注冊碼后,在加載LuOpt64.dll時提供注冊碼即可。一般格式為(注冊碼在冒號后):"dll\LuOpt64.dll:604508320"

2 Lu參數優化函數 [返回頁首]

[返回頁首] luopt::Opt(f, luopt::optconfun,r, luopt::optrange,x1min,x1max,x2min,x2max,...,xnmin,xnmax, luopt::optautorange,autorange, luopt::optmin0,min0, luopt::optmax,max, luopt::optbuf,&buf, luopt::optmode,mode, luopt::optdeep,deep, luopt::optbreadth,breadth, luopt::optkeepmins,keepmins, luopt::optfast,fast, luopt::optwaynull, luopt::optwaysim, luopt::optwaysimdeep, luopt::optwayconfra, luopt::optwaygrad,grad, luopt::optwaygrow, luopt::opteps,eps, luopt::optsameeps,sameeps, luopt::optsameabs,sameabs, luopt::optout,out, luopt::optnum,num, luopt::optarray,a, luopt::optarraybegin,&k, luopt::optarraystarter,arraystarter, luopt::optexpand,expand, luopt::optcontract,contract, luopt::optsimratio,simratio,  luopt::optstarter,&x1, &x2, ... ... , &xn, &min):求無約束或約束條件下的n維極小值

f:自定義n元函數句柄,用于計算目標函數f(x1,x2,...,xn)的值,不可缺省。該函數由用戶自編,格式如下:

f(x1,x2,...,xn)=
{
    g(x1,x2,...,xn)
};

luopt::optconfun,r:自定義n元函數句柄,用于計算約束條件r(x1,x2,...,xn)的值(返回非0值表示滿足約束條件,若不滿足約束條件,應返回0、false或nil),可缺省該參數。該函數由用戶自編,格式如下:

r(x1,x2,...,xn)=
{
    g(x1,x2,...,xn)
};

luopt::optrange,x1min,x1max,x2min,x2max,...,xnmin,xnmax:指定搜索區間 。搜索區間越小,越容易獲得最優值。若缺省該參數,則所有變量區間均為[-1e20~1e20]。
luopt::optautorange,autorange:autorange!=0時將在指定搜索區間內自動調節合適的搜索區間,否則不進行調節。默認是自動調節搜索區間的。
luopt::optmin0,min0:解的可能的極小值。可以缺省該參數,缺省值為±1e-20。
luopt::optmax,max:max>=10,控制搜索精度,max越大精度越高,但時間越長。可以缺省該參數,缺省值為100。
luopt::optbuf,buf:buf>=1,控制緩沖區大小,緩沖區并非越大越好。可以缺省該參數,缺省值為5。
luopt::optmode,mode:mode>=0,控制工作模式。mode越大準確度越大。可以缺省該參數,缺省值為16。
luopt::optdeep,deep:deep>=0,控制搜索深度。deep越大準確度越大。可以缺省該參數,缺省值為20。
luopt::optbreadth,breadth:breadth>=0,控制搜索廣度以替代默認的搜索方法。breadth越大搜索范圍越大。 通常breadth取10~20。可以缺省該參數,breadth=0也相當于缺省該參數。
luopt::optkeepmins,keepmins:keepmins>=0,控制下一輪搜索時保留的極小值數目。可以缺省該參數,keepmins=0也相當于缺省該參數 ,此時保留所有極小值。
luopt::optfast,fast:fast!=0,進行快速搜索。可以缺省該參數,缺省值為fast=0。
luopt::optwaynull:清除所有局部搜索方法。
luopt::optwaysim:使用單形調優法局部搜索,這是默認的局部搜索方法。
luopt::optwaysimdeep:使用單形調優法局部深度搜索。
luopt::optwayconfra:使用連分式局部搜索方法。
luopt::optwaygrad,grad:使用梯度搜索方法。grad>=0,控制梯度搜索的深度。grad越大耗時越長。通常取grad=0。
luopt::optwaygrow:使用擴展式搜索方法。
luopt::opteps,eps:控制精度要求,eps>0。可以缺省該參數,缺省值為1e-6。
luopt::optsameeps,sameeps:相對比較兩組值是否相等的極小值。sameeps>0。可以缺省該參數,缺省值為1e-2。
luopt::optsameabs,sameabs:絕對比較兩組值是否相等的極小值。sameeps>=0。可以缺省該參數,缺省值為1e-3。
luopt::optout,out:是否輸出結果。out非0時輸出。可以缺省該參數,默認輸出結果。
luopt::optnum,num:設置最多輸出的極小值的個數。可以缺省該參數,默認輸出1個極小值。
luopt::optarray,a:提供一個數組,用于接受結果。一組結果包括所有的自變量參數及極小值。默認從數組開始存放數據,也可用參數optarraybegin指定開始存放數據的位置。可以缺省該參數。
luopt::optarraybegin,&k:指定數組中開始存放數據的位置,k返回下一個存放位置。可以缺省該參數,默認從地址0開始存放。
luopt::optarraystarter,arraystarter:arraystarter!=0將指定數組中包含一組初值。可以缺省該參數,缺省值為arraystarter=0。若同時指定了optstarter,optstarter中的初值被忽略。
luopt::optexpand,expand:單形調優法擴張系數。一般取1.2~2.0。可以缺省該參數,缺省值為1.6。
luopt::optcontract,contract:單形調優法收縮系數。一般取0~1。可以缺省該參數,缺省值為0.5。
luopt::optsimratio,simratio:單形調優法調整系數。一般取0~2之間的數,但不可取0和1這兩個值。可以缺省該參數,缺省值為0.9。
luopt::optstarter,&x1, &x2, ... ... , &xn, &min:前n個參數提供一組初值(可為任意值),返回最優參數值 ,最后一個參數返回極小值。可以缺省該參數。

返回值:極小值個數。

說明1:luopt::optmax、luopt::optbuf、luopt::opteps等標識參數類型,次序是任意的,可缺省。

說明2:該函數使用隨機算法搜索全局最小值,故解是不穩定的,應多次搜索甚至變換參數搜索,以最小者為最優。

運行錯誤:

1:指定的表達式不存在;
2:常量表達式或者自變量不能重新賦值;
3:內存錯誤;
4:參數不匹配;
5:不可識別描述符;
6:參數不符合要求;
7:約束函數有錯誤:參數不匹配、自變量重新賦值或者函數不存在;
8:自定義函數返回了非法值。

例子1:計算下列目標函數的極小值點與極小值。
    J=100*(x1-x0*x0)2+(1-x0)2

程序如下:

f(x0,x1)=100*(x1-x0*x0)^2+(1-x0)^2;
luopt::Opt[
@f];

結果:

1. 1. 0.

例子2:求下列隱函數z的最小值:

    z=sin[(z*x-0.5)^2+2*x*y*y-z/10]*exp{-[(x-0.5-exp(-y+z))^2+y*y-z/5+3]}

    其中x范圍[-1,7],y范圍[-2,2]。

程序如下:

!!!using("luopt");
f(x,y,z)=z+1e10*{z-sin[(z*x-0.5)^2+2*x*y*y-z/10]*exp{-[(x-0.5-exp(-y+z))^2+y*y-z/5+3]}}^2;
//構造目標函數,注意1e10
Opt[@f, optwaysimdeep, optwayconfra, optrange,-1.,7., -2.,2., -1e10,1e10];
//Opt[@f, optwaygrow, optrange,-1.,7., -2.,2., -1e10,1e10];    //也可以使用此語句,結果相同

結果:

2.898270235856681 -0.8573130005839527 -2.335408331097716e-002 -2.335408328621853e-002

如果不指定范圍,程序如下:

!!!using("luopt");
f(x,y,z)=z+1e10*{z-sin[(z*x-0.5)^2+2*x*y*y-z/10]*exp{-[(x-0.5-exp(-y+z))^2+y*y-z/5+3]}}^2;
//構造目標函數,注意1e10
Opt[@f, optwaygrow, optwaygrad,0, optmode,200];

結果(需多次運行):

2.898270235856681 -0.8573130005839527 -2.335408331097716e-002 -2.335408328621853e-002

例子3:求針狀函數的全局最小值,并返回10個極小值:

    f(r)=-sin(r)/r+1

    其中:r=sqrt[(x-50)^2+(y-50)^2]+exp[1.0]。

程序如下:

!!!using("luopt");
f(x,y:t)=  
//目標函數定義
{
    t=sqrt[(x-50)^2+(y-50)^2]+exp[1.0],
    -sin[t]/t-1
};
Opt[@f, optwaygrad,0, optnum,10];

結果(需多次運行):

50.               50.               -1.151117991593894
45.04713670154168 50.73409357987649 -1.128374553525899
47.95358156651113 54.56960337517742 -1.128374553259392
48.61084727988142 45.18968474411513 -1.128374553040821
51.53888994360668 55.27956633578699 -1.11373603845343
50.0914003285785  38.652456006392   -1.070913459450462
55.57756844733133 40.1173971653779  -1.070913459450462
47.78264700546625 38.87080820770154 -1.070913459436176
43.59630987066741 40.6315049957481  -1.070913459402211
46.75204544703252 39.12675998582707 -1.070913459306036
10.

3 優化實例

3.1 較難的例子

3.1.1 擬合公式: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

(正解的均方差RMSE=0.033377163531,殘差平方和為0.0211666658630,相關系數R = 0.999497560)

Lu代碼:

!!!using["luopt","math"];
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]
};
main(::Array,max)=
{
    max=19,
    Array=new[reals,max,2].SetArray{
        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
    },
    Opt[@f, optwaysimdeep, optwayconfra, optdeep,50]
};

結果(需多次求解):

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

3.1.2 擬合公式:z = p0*(1-exp(-p1*(x-p2)))+p3*x^p4+p5*x*y;

參數:p0 - p5
變量:x,y,z
數據(x,y,z):
2        101       172
3        14        210
4        136       241
5        52        265
6        67        280
7        81        289
8        54        294
9        20        302
10        6        299
11        2        306

Lu代碼:

!!!using["luopt","math"];
f(p0, p1, p2, p3, p4, p5 :i,s,x,y,z:Array,max)=
{
    s=0,i=0,(i<max).while{
       
x=Array[i,0], y=Array[i,1], z=Array[i,2],
        s=s+[ p0*(1-exp(-p1*(x-p2)))+p3*x^p4+p5*x*y-z]^2,
        i++
    },
    sqrt[s/max]
};
main(::Array,max)=
{
    max=10,
    Array=
new[real_s,max,3].SetArray{
        "2 101 172
        3 14 210
        4 136 241
        5 52 265
        6 67 280
        7 81 289
        8 54 294
        9 20 302
        10 6 299
        11 2 306"
    },
    Opt[@f, optwayconfra]
};

結果(需多次求解):

306.0849059154657 0.4607174830055115 0.9026291308250309 248.1563530146011 -2.274779410407842 -3.621982090081021e-003 1.506033828737254

3.1.3 擬合公式:y=a*(x-d)^4+b*(x-d)^2+c;

x          y
-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

Lu代碼:

!!!using["luopt","math"];
f(a, b, c, d :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)^2+c-y]^2,
        i++
    },
    sqrt[s/max]
};
main(::Array,max)=
{
    max=11,
    Array=new[reals,max,2].SetArray{
    "-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"
    },
    Opt[@f, optwaysimdeep, optwayconfra]
};

結果(需多次求解):

420.0265769742538 -170.7483372687845 35.81768548688493 -0.449622975242104 0.1543213604571683

3.2 非線性擬合測試題

參考:http://www.7d-soft.com/Regression_Test.htm

非線性擬合測試題

NIST的測試題對于其它擬合軟件,可當作驗證標準,但對于1stOpt,實在過于簡單,缺乏挑戰性。下面我們給出九道測試題及由1stOpt計算出的最優解(RMSE:均方差; R^2:相關系數之平方),每道題有且只有唯一的最優解。有興趣的用戶可嘗試任何其它相關軟件工具,看能否得出與我們相同或更優的結果。

當用1stOpt求解時,優化算法均選用麥夸特(LM) + 通用全局優化算法(UGO)。有些試題難度較大,在優化參數設定時可考慮增加”重復數“,比如從缺省的30變為50

 

測試題編號 擬合模型公式 變量名/變量數 參數 均方差 RMSE 相關系數 R^2
1

y=1/(p1+p2*X^p3)+p4*x^p5

x, y p1 to p5

104.376667

0.99678004
2

y = (p1+p2*x1+p3*x2+p4*x3+p5*x4)/(1+a1*x1+a2*x2+a3*x3+a4*x4)

x1 to x4, y p1 to p5, a1 to a4

0.3028129

0.9346422
3

y = p1/(1+p2/x+x/p3)

x, y p1 to p3

0.8767278

0.969929562
4 y = (a0+a1*x1+a2*x2+a3*x3+a4*x4)/(1+b1*x1+b2*x2+b3*x3+b4*x4) x1 to x4, y a0 to a4, b1 to b4

48.05714

0.80514286
5 z = p1+p2*x^p3+p4*y^p5+p6*x^p7*y^p8 x, y, z p1 to p8 0.2703296 0.994632848
6 y = a0+a1*x^k1+a2*x^k2+a3*x^k3 x, y a0 to a3, k1 to k3 0.0214726136 0.999644261
7 z = (p1+p2*x+p3*y+p4*x*y)/(1+p5*x+p6*y+p7*x*y) x, y, z p1 to p7 1.00626078 0.9715471
8 y=p1/((p2+x1)*(1+p3*x2)*(x3-p4)^2)+p5*x3^p6 x, y p1 to p6 0.01977698 0.995372
9 y=a*exp(b*abs(x+c)^d) x, y a, b, c, d 1.1546909 0.9704752

 

測試題1數據

No      x       y

No      x      y

No      x       y

No      x        y

No      x        y

No      x        y

1  160.73  6266.7

2  159.82  6151.9

3  158.84  6035.1

4  157.86  5920.9

5  156.87  5812.6

6  155.88  5702.2

7  154.89  5594.9

8  153.96  5491.3

9  152.97  5385

10 151.98  5282.2

11 150.99  5181.3

12 150.06  5084.8

13 149.08  4988.8

14 148.09  4892.2

15 147.1   4796.9

16 146.17  4701

17 145.18  4608

18 144.2   4515.2

19 143.2   4429.6

20 142.21  4342.9

21 141.25  4255.6

22 140.2   4167.1

23 139.14  4077.6

24 138.05  3987.9

25 136.96  3898.9

26 135.94  3808.5

27 134.84  3717.7

28 133.74  3628.9

29 132.65  3543

30 131.57  3456.3

31 130.55  3372.5

32 129.47  3292.8

33 128.4   3212.7

34 127.33  3133.6

35 126.34  3056.6

36 125.29  2985.5

37 124.26  2912.5

38 123.23  2842.9

39 122.21  2774.1

40 121.21  2708.3

41 120.27  2642.1

42 119.27  2580.2

43 118.29  2518.7

44 117.32  2459.1

45 116.42  2401.1

46 115.48  2344.3

47 114.55  2290.9

48 113.62  2237.5

49 112.7   2189

50 111.85  2138.8

51 110.94  2089.4

52 110.03  2042.4

53 109.13  1998.1

54 108.28  1953.6

55 107.38  1906.6

56 106.48  1867.8

57 105.6   1824.5

58 104.72  1784.3

59 103.91  1745

60 103.05  1704.5

61 102.2   1668.7

62 101.35  1629  

63 100.51  1590.4

64 99.739  1552.5

65 98.913  1514.7

66 98.103  1476.4

67 97.308  1444.3

68 96.513  1411.4

69 95.78   1378.5

70 95.002  1344.8

71 94.239  1307.8

72 93.482  1276.1

73 92.776  1243.5

74 92.039  1212.9

75 91.314  1178.7

76 90.604  1148.4

77 89.942  1115.9

78 89.244  1084.5

79 88.559  1051.5

80 87.889  1029.7

81 87.226  996.16

82 86.569  965.86

83 85.963  937.72

84 85.323  907.87

85 84.694  877.58

86 84.081  838.17

87 83.473  819.48

88 82.876  797.76

89 82.287  768.54

90 81.811  749.96

91  81.178  724.39

92  80.614  697.24

93  80.118  674.67

94  79.574  649.49

95  79.011  629.83

96  78.478  614.6

97  78.012  591.87

98  77.494  573.43

99  76.927  558.94

100 76.512  539.45

101 75.962  526.99

102 75.472  514.14

103 75.014  504.11

104 74.566  484.4

105 74.123  473.23

106 73.608  468.93

107 73.183  453.77

108 72.774  448.58

109 72.369  447.73

110 71.897  431.79

111 71.503  432.45

112 71.116  432.15

113 70.741  420.71

114 70.3    427.26

115 69.935  419.76

116 69.572  407.28

117 69.148  408.04

118 68.796  393.71

119 68.448  403.74

120 68.114  408.8

121 67.717  401.26

122 67.374  400.81

123 67.037  401.89

124 66.741  408.68

125 66.416  398.49

126 66.015  414.14

127 65.373  419.78

128 64.769  426.82

129 64.109  418.42

130 63.44   446.32

131 62.772  451.55

132 62.111  473.27

133 61.508  499.69

134 60.908  523.66

135 60.219  551.47

136 59.699  593.53

137 59.119  608.69

138 58.547  658.08

139 57.992  712.27

140 57.483  769.4

141 56.969  826.48

142 56.472  896.05

143 55.989  957.57

144 55.513  1065.1

145 55.088  1114.1

146 54.651  1195

147 54.237  1271.5

148 53.836  1355.6

149 53.318  1483.2

150 52.701  1690

151 52.08   2245.9

152 51.431  2470.4

153 50.877  2719.1

154 50.298  2957.5

155 49.74   3155.2

156 49.2    3279.4

157 48.702  3546.4

158 48.182  3741

159 47.681  4021

160 47.213  4015.1

161 46.768  4304.7

162 46.368  4127.9

163 45.956  4530.9

164 45.55   4802.9

165 45.157  5047.4

166 44.799  4804.3

167 44.43   5164.1

168 44.078  4781

169 43.727  5175.5

170 43.384  5708.6

171 43.079  5679.6

172 42.899  5161.8

173 42.719  5399.1

174 42.547  5483

175 42.253  4839.4

176 41.962  5360.7

177 41.691  5622

178 40.602  5772.3

 

測試題2數據

測試題3數據

測試題4數據

測試題5數據

No  x1    x2     x3    x4    y

No      x      y

No  x1  x2   x3  x4   y

No.  x   y   z

1  15100 29000   508.0 180 3.40

2  20500 43350   453.7 141 3.00

3  80000 92610   487.9 132 2.70

4  91500 142775  572.3 182 3.37

5  82500 2123160 455.7 113 6.89

6  20000 227800  481.3 170 5.03

7  17800 140000  541.3 179 3.55

8  3900  15980   538.6 186 2.72

9  17300 223200  460.6 100 4.05

10 25700 229400  393.1 133 3.22

11 49400 424500  373.9 106 2.65

12 40700 561700  482.8 107 1.91

13 77000 563600  482.1 140 3.00

14 92900 557600  415.1 121 1.31

15 63300 528300  536.7 144 2.33

16 51600 488940  385.1 154 3.55

17 60000 480500  412.2 111 3.37

18 70000 530500  567.2 139 2.55

1  80.0    6.64  

2  140.9   11.54

3  204.7   15.89

4  277.9   20.16

5  356.8   21.56

6  453.0   21.69

7  505.6   22.66

8  674.5   23.15

9  802.32  18.16

10 936.04  16.81

1  14  1.38  -34  16  582

2  10  0.52  -29  2   458

3  13  1.70  -32  13  559

4  24  0.80  24   1   322

5  12  1.83  41   11  399

6  6   1.77  -50  7   523

7  18  1.23  27   4   322

8  -10 0.28  -8   6   358

9  0   1.20  66   6   354

10 14  1.75  -60  6   574

11 12  1.78  -70  7   489

12 -18 1.37  -15  0   232

13 16  1.38  0    4   440

14 -4  0.29  -9   -7  421

15 -23 1.12  -12  -14 181

16 5   1.52  0    10  426

17 -16 0.63  34   1   364

18 -1  1.32  22   -7  375

19 -18 1.18  4    -11 224

20 8   1.50  -11  5   514

21 -8  1.43  4    -12 381

22 -11 0.74  10   0   275

23 -19 1.07  -5   0   426

1  500  25  1.5   

2  500  50  2.25  

3  500  100 3.15  

4  500  200 4.0   

5  500  300 4.2   

6  500  400 4.3   

7  1000 25  1.45  

8  1000 50  2.35  

9  1000 100 3.95  

10 1000 200 6.95  

11 1000 300 8.15  

12 1000 400 8.4   

13 1500 25  1.45  

14 1500 50  2.45  

15 1500 100 4.15  

16 1500 200 7.45  

17 1500 300 10.65

18 1500 400 11.85

19 2000 25  1.45  

20 2000 50  2.5   

21 2000 100 4.2   

22 2000 200 7.75  

23 2000 300 11.45

24 2000 400 14.3  

 

測試題6數據

測試題7數據

測試題8數據

測試題9數據

No      x      y

No      x      y      z

No   x1    x2     x3    y

No      x      y

1       1.0     8.2

2       2.0     4.6

3       3.0     4.3

4       4.0     4.6

5       5.0     5.1

6       6.0     5.5

7       7.0     5.7

8       8.0     5.5

9       9.0     5.0

10      10.0    3.8

1  4332  26.94   43.70  

2  4697  23.64   44.50  

3  5062  25.19   47.70  

4  5428  28.60   52.30  

5  5793  28.74   54.21  

6  6158  29.33   55.58  

7  6523  32.92   55.70  

8  6889  31.87   57.70  

9  7254  33.07   58.60  

10 7619  29.36   60.24  

11 7984  27.96   59.13  

12 8350  30.18   57.00  

13 8715  37.84   57.30  

14 9080  38.86   59.00  

15 9445  35.18   60.20  

16 9811  28.81   61.80  

17 10176 34.57   63.17  

18 10541 37.49   66.23  

19 10906 29.30   61.80  

20 11272 32.47   62.03  

21 11637 38.24   65.30  

1  34.9 0.043378  8  0.996556   

2  34.9 0.216888  8  0.985708   

3  34.9 0.433776  8  0.973826   

4  58.2 0.026027  8  0.999409   

5  58.2 0.130133  8  0.99817    

6  58.2 0.260265  8  1.000176   

7  93.1 0.016267  8  0.995131   

8  93.1 0.081333  8  1.009887   

9  93.1 0.162666  8  1.008251   

10 34.9 0.043378  20 0.835576   

11 34.9 0.216888  20 0.777734   

12 34.9 0.433776  20 0.715483   

13 58.2 0.026027  20 0.854949   

14 58.2 0.130133  20 0.822743   

15 58.2 0.260265  20 0.784273   

16 93.1 0.016267  20 0.85902    

17 93.1 0.081333  20 0.841512   

18 93.1 0.162666  20 0.81895    

19 34.9 0.043378  40 0.387322   

20 34.9 0.216888  40 0.338941   

21 34.9 0.433776  40 0.293558   

22 58.2 0.026027  40 0.342388   

23 58.2 0.130133  40 0.311761   

24 58.2 0.260265  40 0.280112   

25 93.1 0.016267  40 0.308071   

26 93.1 0.081333  40 0.287257   

27 93.1 0.162666  40 0.264443   

1       27.25   1

2       27.75   3

3       28.25   6

4       28.75   13

5       29.25   18

6       29.75   19

7       30.25   17

8       30.75   16

9       31.25   6

10      31.75   5

11      32.25   2

第1題:

!!!using["luopt","math"];
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+[1/(p1+p2*x^p3)+p4*x^p5-y]^2,
    i++
  },
  sqrt[s/max]
};
main(::Array,max)=
{
    max=178,
    Array=new[reals,max,2].SetArray{
160.73, 6266.7,
159.82, 6151.9,
158.84, 6035.1,
157.86, 5920.9,
156.87, 5812.6,
155.88, 5702.2,
154.89, 5594.9,
153.96, 5491.3,
152.97, 5385,
151.98, 5282.2,
150.99, 5181.3,
150.06, 5084.8,
149.08, 4988.8,
148.09, 4892.2,
147.1 , 4796.9,
146.17, 4701,
145.18, 4608,
144.2 , 4515.2,
143.2 , 4429.6,
142.21, 4342.9,
141.25, 4255.6,
140.2 , 4167.1,
139.14, 4077.6,
138.05, 3987.9,
136.96, 3898.9,
135.94, 3808.5,
134.84, 3717.7,
133.74, 3628.9,
132.65, 3543,
131.57, 3456.3,

130.55, 3372.5,
129.47, 3292.8,
128.4 , 3212.7,
127.33, 3133.6,
126.34, 3056.6,
125.29, 2985.5,
124.26 , 2912.5,
123.23, 2842.9,
122.21, 2774.1,
121.21, 2708.3,
120.27, 2642.1,
119.27, 2580.2,
118.29, 2518.7,
117.32, 2459.1,
116.42, 2401.1,
115.48, 2344.3,
114.55, 2290.9,
113.62, 2237.5,
112.7 , 2189,
111.85, 2138.8,
110.94, 2089.4,
110.03 , 2042.4,
109.13 , 1998.1,
108.28, 1953.6,
107.38, 1906.6,
106.48, 1867.8,
105.6 , 1824.5,
104.72 , 1784.3,
103.91, 1745,
103.05, 1704.5,

102.2, 1668.7,
101.35, 1629 ,
100.51, 1590.4,
99.739, 1552.5,
98.913 , 1514.7,
98.103, 1476.4,
97.308, 1444.3,
96.513, 1411.4,
95.78 , 1378.5,
95.002, 1344.8,
94.239, 1307.8,
93.482, 1276.1,
92.776, 1243.5,
92.039, 1212.9,
91.314, 1178.7,
90.604 , 1148.4,
89.942, 1115.9,
89.244 , 1084.5,
88.559, 1051.5,
87.889, 1029.7,
87.226, 996.16,
86.569 , 965.86,
85.963, 937.72,
85.323, 907.87,
84.694, 877.58,
84.081 , 838.17,
83.473, 819.48,
82.876, 797.76,
82.287, 768.54,
81.811, 749.96,

81.178, 724.39,
80.614 , 697.24,
80.118, 674.67,
79.574, 649.49,
79.011, 629.83,
78.478, 614.6,
78.012, 591.87,
77.494 , 573.43,
76.927, 558.94,
76.512, 539.45,
75.962, 526.99,
75.472, 514.14,
75.014, 504.11,
74.566, 484.4,
74.123, 473.23,
73.608, 468.93,
73.183, 453.77,
72.774, 448.58,
72.369, 447.73,
71.897, 431.79,
71.503, 432.45,
71.116, 432.15,
70.741, 420.71,
70.3, 427.26,
69.935, 419.76,
69.572, 407.28,
69.148, 408.04,
68.796, 393.71,
68.448, 403.74,
68.114, 408.8,

67.717, 401.26,
67.374, 400.81,
67.037, 401.89,
66.741, 408.68,
66.416, 398.49,
66.015, 414.14,
65.373, 419.78,
64.769, 426.82,
64.109, 418.42,
63.44 , 446.32,
62.772, 451.55,
62.111, 473.27,
61.508, 499.69,
60.908, 523.66,
60.219, 551.47,
59.699, 593.53,
59.119, 608.69,
58.547, 658.08,
57.992, 712.27,
57.483, 769.4,
56.969, 826.48,
56.472, 896.05,
55.989, 957.57,
55.513, 1065.1,
55.088, 1114.1,
54.651, 1195,
54.237, 1271.5,
53.836, 1355.6,
53.318, 1483.2,
52.701, 1690,

52.08 , 2245.9,
51.431, 2470.4,
50.877, 2719.1,
50.298, 2957.5,
49.74 , 3155.2,
49.2 , 3279.4,
48.702, 3546.4,
48.182, 3741,
47.681, 4021,
47.213, 4015.1,
46.768, 4304.7,
46.368, 4127.9,
45.956, 4530.9,
45.55 , 4802.9,
45.157, 5047.4,
44.799, 4804.3,
44.43 , 5164.1,
44.078, 4781,
43.727, 5175.5,
43.384, 5708.6,
43.079, 5679.6,
42.899, 5161.8,
42.719, 5399.1,
42.547, 5483,
42.253, 4839.4,
41.962, 5360.7,
41.691, 5622,
40.602, 5772.3
    },
   
Opt[@f]
};


結果(需嘗試幾次):

1.773989909927714e-004 7.12634775546666e-033 16.72488443285935 1.215887381574098e-003 3.043657279780005 104.376667977067

第2題:尚未獲得正解

!!!using["luopt","math"];
f(p1,p2,p3,p4,p5,a1,a2,a3,a4:i,s,x1,x2,x3,x4,y:Array,max)=
{
    s=0,i=0,(i<max).while{
        x1=Array[i,0], x2=Array[i,1], x3=Array[i,2], x4=Array[i,3], y=Array[i,4],
        s=s+[(p1+p2*x1+p3*x2+p4*x3+p5*x4)/(1+a1*x1+a2*x2+a3*x3+a4*x4)-y]^2,
        i++
    },
    sqrt[s/max]
};
init(::Array,max)=
{
    max=18,
    Array=new[reals,max,5].SetArray{
15100, 29000, 508.0, 180, 3.40,
20500, 43350, 453.7, 141, 3.00,
80000, 92610, 487.9, 132, 2.70 ,
91500, 142775, 572.3, 182, 3.37,
82500, 2123160, 455.7, 113, 6.89 ,
20000, 227800, 481.3, 170, 5.03 ,
17800, 140000, 541.3, 179, 3.55 ,
3900,  15980, 538.6, 186, 2.72 ,
17300, 223200, 460.6, 100, 4.05 ,
25700, 229400, 393.1, 133, 3.22 ,
49400, 424500, 373.9, 106, 2.65 ,
40700, 561700, 482.8, 107, 1.91 ,
77000, 563600, 482.1, 140, 3.00 ,
92900, 557600, 415.1, 121, 1.31 ,
63300, 528300, 536.7, 144, 2.33 ,
51600, 488940, 385.1, 154, 3.55 ,
60000, 480500, 412.2, 111, 3.37 ,
70000, 530500, 567.2, 139, 2.55
    },
    Opt[@f, optmax,100, optmode,800, optwaysimdeep, optwayconfra, optdeep,50, optrange,-1e5,1e5,-1e5,1e5,-1e5,1e5,-1e5,1e5,-1e5,1e5,-1e5,1e5,-1e5,1e5,-1e5,1e5,-1e5,1e5]
};

結果(目前最佳結果):

4.583427346530832 2.621772251388336e-004 -7.953081331666974e-006 -2.705145975115526e-002 3.317684739245875e-002 9.543357732870576e-005 -3.046125660450937e-006 -6.69775198496449e-003 6.681298851773985e-003 0.4396473216975189

第3題:

!!!using["luopt"];
g(x,y,p1,p2,p3)={p1/(1+p2/x+x/p3)-y}^2;
f(p1,p2,p3)=
{
    sqrt{[g(80.0 , 6.64 ,p1,p2,p3)+
    g(140.9 , 11.54 ,p1,p2,p3)+
    g(204.7 , 15.89 ,p1,p2,p3)+
    g(277.9 , 20.16 ,p1,p2,p3)+
    g(356.8 , 21.56 ,p1,p2,p3)+
    g(453.0 , 21.69 ,p1,p2,p3)+
    g(505.6 , 22.66 ,p1,p2,p3)+
    g(674.5 , 23.15 ,p1,p2,p3)+
    g(802.32 , 18.16 ,p1,p2,p3)+
    g(936.04 , 16.81 ,p1,p2,p3)]/10}
};
Opt[@f];

結果(需嘗試幾次):

-101.0805795116041 -1258.521466815511 -170.1106261401753 0.8767278704475284

第4題:

!!!using["luopt","math"];
f(a0, a1, a2, a3, a4,b1,b2,b3,b4:i,s,x1,x2,x3,x4,y:Array,max)=
{
    s=0,i=0,(i<max).while{
        x1=Array[i,0], x2=Array[i,1], x3=Array[i,2], x4=Array[i,3], y=Array[i,4],
        s=s+[(a0+a1*x1+a2*x2+a3*x3+a4*x4)/(1+b1*x1+b2*x2+b3*x3+b4*x4)-y]^2,
        i++
    },
    sqrt[s/max]
};
main(::Array,max)=
{
    max=23,
    Array=new[reals,max,5].SetArray{
        14 , 1.38 , -34, 16, 582 ,
        10, 0.52 , -29, 2 , 458 ,
        13 , 1.70 , -32 , 13 , 559 ,
        24 , 0.80 , 24 , 1 , 322 ,
        12 , 1.83 , 41 , 11, 399 ,
        6 , 1.77 , -50 , 7 , 523 ,
        18, 1.23 , 27 , 4 , 322 ,
        -10, 0.28, -8, 6 , 358 ,
        0 , 1.20 , 66 , 6 , 354 ,
        14 , 1.75, -60 , 6 , 574 ,
        12 , 1.78 , -70 , 7 , 489 ,
        -18, 1.37, -15 , 0 , 232 ,
        16, 1.38, 0 , 4 , 440 ,
        -4, 0.29, -9 , -7, 421 ,
        -23, 1.12, -12, -14, 181 ,
        5 , 1.52, 0 , 10 , 426 ,
        -16, 0.63, 34 , 1 , 364 ,
        -1 , 1.32 , 22 , -7 , 375 ,
        -18, 1.18, 4 , -11, 224 ,
        8., 1.50 , -11 , 5 , 514 ,
        -8 , 1.43, 4 , -12, 381 ,
        -11, 0.74, 10 , 0 , 275 ,
        -19, 1.07, -5, 0 , 426
    },
    Opt[@f, optwaysimdeep, optwayconfra]
};

結果(需求解幾次):

674.6781937042127 227.7453915656436 2120.317418232974 1.643200016850861 -176.0515628702959 0.5725832815136416 5.556417489954765 3.344065962703589e-002 -0.5600170829989317 48.05714060993065

第5題:

!!!using["luopt","math"];
f(p1, p2, p3, p4, p5,p6,p7,p8:i,s,x,y,z:Array,max)=
{
    s=0,i=0,(i<max).while{
        x=Array[i,0], y=Array[i,1], z=Array[i,2],
        s=s+[ p1+p2*x^p3+p4*y^p5+p6*x^p7*y^p8-z]^2,
        i++
    },
    sqrt[s/max]
};
main(::Array,max)=
{
    max=24,
    Array=new[reals,max,3].SetArray{
500, 25, 1.5 ,
500, 50, 2.25 ,
500, 100 ,3.15 ,
500, 200, 4.0 ,
500, 300, 4.2 ,
500, 400, 4.3 ,
1000, 25 , 1.45 ,
1000, 50 , 2.35 ,
1000, 100, 3.95 ,
1000, 200, 6.95 ,
1000, 300, 8.15 ,
1000, 400, 8.4 ,
1500, 25 , 1.45 ,
1500, 50 , 2.45 ,
1500, 100, 4.15 ,
1500, 200, 7.45 ,
1500, 300, 10.65 ,
1500, 400, 11.85 ,
2000, 25 , 1.45 ,
2000, 50 , 2.5 ,
2000, 100, 4.2 ,
2000, 200, 7.75 ,
2000, 300, 11.45 ,
2000, 400, 14.3
    },
    Opt[@f, optmax,200, optwaysimdeep, optwayconfra, optdeep,50]
};

結果(需多次求解):

1.028492626137522 -2.750850635111363e-014 4.045587756019219 -1.367092297732806e-003 1.623222334047968 2.679931221480448e-003 0.2533017000609598 1.268069564889027 0.2703296912011674

第6題:

!!!using["luopt","math"];
f(a0, a1, a2, a3, k1,k2,k3 :i,s,x,y:Array,max)=
{
    s=0,i=0,(i<max).while{
        x=Array[i,0], y=Array[i,1],
        s=s+[ a0+a1*x^k1+a2*x^k2+a3*x^k3-y]^2,
        i++
    },
    sqrt[s/max]
};
main(::Array,max)=
{
    max=10,
    Array=new[reals,max,2].SetArray{
        1.0, 8.2,
        2.0, 4.6,
        3.0, 4.3,
        4.0, 4.6,
        5.0, 5.1,
        6.0, 5.5,
        7.0, 5.7,
        8.0, 5.5,
        9.0, 5.0,
        10.0,3.8
    },
    Opt[@f, optwaysimdeep, optwayconfra]
};

結果(需多次求解):

-2.435047968667117 -5.596012968756312e-004 1.746941301238457 8.888535605114285 4.021264991475747 0.8188562111431067 -1.1645140483289 2.147261368496635e-002

第7題:

!!!using["luopt","math"];
f(p1, p2, p3, p4, p5,p6,p7:i,s,x,y,z:Array,max)=
{
    s=0,i=0,(i<max).while{
        x=Array[i,0], y=Array[i,1], z=Array[i,2],
        s=s+[ (p1+p2*x+p3*y+p4*x*y)/(1+p5*x+p6*y+p7*x*y)-z]^2,
        i++
    },
    sqrt[s/max]
};
main(::Array,max)=
{
    max=21,
    Array=new[reals,max,3].SetArray{
4332, 26.94 , 43.70 ,
4697, 23.64 , 44.50 ,
5062, 25.19 , 47.70 ,
5428, 28.60 , 52.30 ,
5793, 28.74 , 54.21 ,
6158, 29.33 , 55.58 ,
6523, 32.92 , 55.70 ,
6889, 31.87 , 57.70 ,
7254, 33.07 , 58.60 ,
7619 , 29.36 , 60.24 ,
7984, 27.96 , 59.13 ,
8350 , 30.18 , 57.00 ,
8715 , 37.84 , 57.30 ,
9080 , 38.86 , 59.00 ,
9445 , 35.18 , 60.20 ,
9811 , 28.81 , 61.80 ,
10176, 34.57 , 63.17 ,
10541, 37.49 , 66.23 ,
10906, 29.30 , 61.80 ,
11272, 32.47 , 62.03 ,
11637, 38.24 , 65.30
    },
    Opt[@f, optmax,100, optmode,200, optwaysimdeep, optwayconfra, optdeep,50, optrange,-1e10,1e10,-1e10,1e10,-1e10,1e10,-1e10,1e10,-1e10,1e10,-1e5,1e5,-1e5,1e5]
};

結果(需多次求解):

92.07386083215749 -2.673470802502084e-002 -2.720784311480835 7.444462298472703e-004 -3.845503645661088e-004 -3.039200875467085e-002 1.070399375206463e-005 1.006260685262059

第8題:

!!!using["luopt","math"];
f(p1, p2, p3, p4, p5,p6:i,s,x1,x2,x3,y:Array,max)=
//目標函數定義
{
    s=0,i=0,(i<max).while{
        x1=Array[i,0], x2=Array[i,1], x3=Array[i,2], y=Array[i,3],
        s=s+[ p1/((p2+x1)*(1+p3*x2)*(x3-p4)^2)+p5*x3^p6-y]^2,
        i++
    },
    sqrt[s/max]
};
main(::Array,max)=
{
    max=27,
    Array=new{reals,max,4, data:
        34.9, 0.043378, 8., 0.996556 ,
        34.9, 0.216888, 8., 0.985708 ,
        34.9, 0.433776, 8., 0.973826 ,
        58.2, 0.026027, 8., 0.999409 ,
        58.2, 0.130133, 8., 0.99817 ,
        58.2, 0.260265, 8., 1.000176 ,
        93.1, 0.016267, 8., 0.995131 ,
        93.1, 0.081333, 8., 1.009887 ,
        93.1, 0.162666, 8., 1.008251 ,
        34.9, 0.043378, 20., 0.835576 ,
        34.9, 0.216888, 20., 0.777734 ,
        34.9, 0.433776, 20., 0.715483 ,
        58.2, 0.026027, 20., 0.854949 ,
        58.2, 0.130133, 20., 0.822743 ,
        58.2, 0.260265, 20., 0.784273 ,
        93.1, 0.016267, 20., 0.85902 ,
        93.1, 0.081333, 20., 0.841512 ,
        93.1, 0.162666, 20., 0.81895 ,
        34.9, 0.043378, 40., 0.387322 ,
        34.9, 0.216888, 40., 0.338941 ,
        34.9, 0.433776, 40., 0.293558 ,
        58.2, 0.026027, 40., 0.342388 ,
        58.2, 0.130133, 40., 0.311761 ,
        58.2, 0.260265, 40., 0.280112 ,
        93.1, 0.016267, 40., 0.308071 ,
        93.1, 0.081333 , 40., 0.287257 ,
        93.1, 0.162666, 40., 0.264443
    },
    Opt[@f, optwaysimdeep, optwayconfra]
};

結果(需多次求解):

178963.6676067503 3672.74944952677 0.530211167053818 27.80500822839966 195.3596009106615 -2.596554487779508 1.977698395027922e-002

第9題:

!!!using["luopt"];
y(x,a,b,c,d)=a*exp(b*abs(x+c)^d);
f(a,b,c,d)=
{
    sqrt{{[y(27.25 ,a,b,c,d)-1]^2
    +[y(27.75 ,a,b,c,d)-3]^2
    +[y(28.25 ,a,b,c,d)-6]^2
    +[y(28.75 ,a,b,c,d)-13]^2
    +[y(29.25 ,a,b,c,d)-18]^2
    +[y(29.75 ,a,b,c,d)-19]^2
    +[y(30.25 ,a,b,c,d)-17]^2
    +[y(30.75 ,a,b,c,d)-16]^2
    +[y(31.25 ,a,b,c,d)-6]^2
    +[y(31.75 ,a,b,c,d)-5]^2
    +[y(32.25 ,a,b,c,d)-2]^2}/11}
};
Opt[@f, optwaysimdeep, optwayconfra];
//Opt[@f, optwaygrow, optwaygrad,0];    //也可以使用此語句,效果更好

結果(需多次求解):

19.15817773649649 -0.3625927565554836 -29.81592272236692 2.297951055806539 1.15469090018263

4 求方程(組)的全部解

[返回頁首] luopt::iFind(f, luopt::optmax,m, luopt::optrange,min,max, luopt::opteps,eps, luopt::optexact,exact, luopt::optpara,x1,x2,..., luopt::optthis,i, luopt::optmin0,min0, luopt::optsameeps,sameeps, luopt::optsameabs,sameabs, luopt::optstarter,starter, luopt::optarray,a, luopt::optarraybegin,&k, luopt::optout,out, luopt::optnum,num):求單變量方程的全部解

f:自定義n元函數句柄,不可缺省。格式如下:

f(x1,x2,...,xn)=
{
    ... ...
};

    默認求方程f(x1,x2,...,xn)=0第一個自變量的全部解,而其他自變量賦值為0.0。可以用參數optthis指定求解的自變量,也可以用參數optpara給出其他自變量的值。

luopt::optmax,m:區間分割數目(大于等于10),區間分割數目越多精度越高。可以缺省該參數,缺省值為200。
luopt::optrange,min,max:指定求解區間。若缺省該參數,則min為-1e50,max為1e50。
luopt::opteps,eps:控制精度要求,eps>0。可以缺省該參數,缺省值為1e-6。
luopt::optexact,exact:控制精度的方式,exact非0將嚴格控制精度,否則只追求解的正確性,盡可能滿足解的精度。可以缺省該參數,將嚴格控制解的精度。
luopt::optpara,x1,x2,...:給指定求解自變量之外的其他自變量賦值,參數x1,x2,...的個數比全部自變量個數少1。若缺省該參數,其他自變量缺省值均為0.0。
luopt::optthis,i:指定求解的自變量。0表示第一個自變量;1表示第二個自變量,以此類推。若缺省該參數,i為0。
luopt::optmin0,min0:解的可能的極小值。可以缺省該參數,缺省值為±1e-50。
luopt::optsameeps,sameeps:相對比較兩組值是否相等的極小值。sameeps>0。可以缺省該參數,缺省值為1e-3。
luopt::optsameabs,sameabs:絕對比較兩組值是否相等的極小值。sameeps>=0。可以缺省該參數,缺省值為0.0。
luopt::optstarter,starter:提供一個初值。可以缺省該參數。
luopt::optarray,a:提供一個數組,用于接受結果。一組結果包括所有的自變量參數及誤差。默認從數組開始存放數據,也可用參數optarraybegin指定開始存放數據的位置。可以缺省該參數。
luopt::optarraybegin,&k:指定數組中開始存放數據的位置,k返回下一個存放位置。可以缺省該參數,默認從地址0開始存放。
luopt::optout,out:是否輸出結果。out非0時輸出。可以缺省該參數,默認輸出結果。
luopt::optnum,num:設置最多求解的解的個數。可以缺省該參數,默認最多求解100個解。

返回值:解的個數。

運行錯誤:

1:指定的表達式不存在;
2:常量表達式;
3:自變量參數重新賦值,這是不允許的;
4:參數不匹配;
5:不可識別描述符;
6:參數不符合要求;
7:自定義函數返回了非法值。

例子1:求方程的全部解:f(x)=x^6-5*x^5+3*x^4+x^3-7*x^2+7*x-20;

f(x)=x^6-5*x^5+3*x^4+x^3-7*x^2+7*x-20;
luopt::iFind[@f];

例子2:求方程的全部解(x取-8~8,y取1):f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;

!!!using("luopt");
f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;
iFind[@f,optrange,-8.,8.,optpara,1.];

例子3:求方程的全部解(x取1,y取-8~8):f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;

!!!using("luopt");
f(x,y)=(x^2+y^2)^3-36*(x^2-y^2)^2;
iFind[@f, optrange,-8.,8., optthis,1, optpara,1.];

[返回頁首] luopt::Find(f, luopt::optmax,m, luopt::optmode,mode, luopt::optdeep,deep, luopt::optrange,x1min,x1max,x2min,x2max,...,xnmin,xnmax, luopt::optautorange,autorange,luopt::opteps,eps, luopt::optmin0,min0, luopt::optsameeps,sameeps, luopt::optsameabs,sameabs, luopt::optstarter,&x1,&x2,...,&xn,&min, luopt::optarray,a, luopt::optarraybegin,&k, luopt::optexpand,expand, luopt::optcontract,contract, luopt::optdx,dx, luopt::optstep,step, luopt::optout,out, luopt::optnum,num):求方程組的全部解

f:自定義2*n元函數句柄,不可缺省,必須由二級函數HFor獲得該句柄。格式如下:

f(x1,x2,...,xn,y1,y2,...,yn)=
{
    y1= ...,
    y2= ...,
    ... ...,
    yn= ...
};

luopt::optmax,m:隨機點的數目(大于等于10),點數越多精度越高。可以缺省該參數,缺省值為200。
luopt::optmode,mode:工作模式,取0、1、2、3、... ...。通常,工作模式取值越大,搜到的解越多,但耗時越長。若缺省該參數,工作模式取0。
luopt::optdeep,deep:搜索深度,取0、1、2、3、... ...。通常,搜索深度取值越大,搜到的解越多,但耗時越長。若缺省該參數,搜索深度取0。
luopt::optrange,x1min,x1max,x2min,x2max,...,xnmin,xnmax:指定求解區間。若缺省該參數,則所有變量區間均為[-1e50~1e50]。
luopt::optautorange,autorange:autorange!=0時將在指定搜索區間內自動調節合適的搜索區間,否則不進行調節。默認是不會自動調節搜索區間的。
luopt::opteps,eps:控制精度要求,eps>0。可以缺省該參數,缺省值為1e-6。滿足sqrt[(y1*y1+y2*y2+...+yn*yn)/n]<eps
luopt::optmin0,min0:解的可能的極小值。可以缺省該參數,缺省值為±1e-50。
luopt::optsameeps,sameeps:相對比較兩組值是否相等的極小值。sameeps>0。可以缺省該參數,缺省值為1e-2。
luopt::optsameabs,sameabs:絕對比較兩組值是否相等的極小值。sameeps>=0。可以缺省該參數,缺省值為1e-3。
luopt::optstarter,&x1,&x2,...,&xn,&min:前n個參數提供一組初值,并返回一組解;最后一個參數min返回該組解的誤差。可以缺省該參數。
luopt::optarray,a:提供一個數組,用于接受結果。一組結果包括所有的自變量參數及誤差。默認從數組開始存放數據,也可用參數optarraybegin指定開始存放數據的位置。可以缺省該參數。
luopt::optarraybegin,&k:指定數組中開始存放數據的位置,k返回下一個存放位置。可以缺省該參數,默認從地址0開始存放。
luopt::optexpand,expand:擴張系數。一般取1.2~2.0。可以缺省該參數,缺省值為1.6。
luopt::optcontract,contract:收縮系數。一般取0~1。可以缺省該參數,缺省值為0.5。
luopt::optdx,dx:搜索增量初值,dx>0。可以缺省該參數,缺省值為0.1。
luopt::optstep,step:搜索步長修正系數。step取0~1之間的數。可以缺省該參數,缺省值為0.1。
luopt::optout,out:是否輸出結果。out非0時輸出。可以缺省該參數,默認輸出結果。
luopt::optnum,num:設置最多求解的解的個數。可以缺省該參數,默認最多求解10個解。

返回值:解的個數。

說明:需要多次運行該函數以獲得需要的解。

運行錯誤:

1:指定的表達式不存在;
2:常量表達式或者參數不成對;
3:內存錯誤;
4:參數不匹配;
5:不可識別描述符;
6:參數不符合要求;
7:自定義函數返回了非法值。

例子1:解方程組:

(x-y)^2-3*(x-y) = 10
x^2+2*x*y+y^2 = 9

代碼:

f(x,y,y1,y2)=
{
  y1=(x-y)^2-3*(x-y)-10,
  y2=x^2+2*x*y+y^2-9
};
luopt::Find[@f];

例子2:解方程組:

2*x1-x2^2-exp(-x1) = 0
-(x1^3)+x1*x2-exp(-x2) = 0

代碼:

f(x1,x2,y1,y2)=
{
  y1=2*x1-x2^2-exp(-x1),
  y2=-(x1^3)+x1*x2-exp(-x2)
};
luopt::Find[@f];

例子3:解方程組:t取-7~7

-b*sin(a+6*t)+n-40.4945=0
-b*sin(a+7*t)+n-40.5696=0
-b*sin(a+8*t)+n-41.0443=0
-b*sin(a+9*t)+n-41.4190=0

代碼:

!!!using["luopt"];
f(a,b,n,t,y1,y2,y3,y4)=
{
  y1=-b*sin(a+6*t)+n-40.4945,
  y2=-b*sin(a+7*t)+n-40.5696,
  y3=-b*sin(a+8*t)+n-41.0443,
  y4=-b*sin(a+9*t)+n-41.4190
};
Find[@f, optmode,5, optrange,-1e50,1e50,-1e50,1e50,-1e50,1e50,-7.,7.];


版權所有© Lu程序設計 2011-2013,保留所有權利
E-mail: [email protected]
  QQ:630715621
最近更新: 2016年08月25日

pk10冠军百期错一