FCC文件
缺省設置:
(XNote=請修改為X軸單位) (YNote=請修改為Y軸單位)
(AutoY=1) (XMin=0) (XMax=1) (YMin=0) (YMax=1)
(BorderPixels=60) (MultiplyX=1) (MultiplyY=1) (Grid=0) (DivideXY=10) (XYNumWidth=3) (DataMax=2)
(ForMax=50) (LoadDll=)
[CODE]
// 通用設置:
// (XNote=請修改為X軸單位) (YNote=請修改為Y軸單位)
// (AutoY=1) (XMin=0) (XMax=30) (YMin=0) (YMax=1)
// (BorderPixels=80) (MultiplyX=1) (MultiplyY=1) (Grid=0) (DivideXY=10)??(XYNumWidth=3) (DataMax=6)
// (ForMax=50) (LoadDll="dll\FcData32W" "dll\XSLSF32W") (DotColor=0) (DotSize=10)
/*[LINE]
(_DataDot0=1,30,0,3,16711680)
(_DataLine0=1,1000,0,0,12615680)
(_DataDot1=1,30,0,3,0)
(_DataLine1=1,1000,0,0,65408)
(_DataDot2=1,30,0,3,16776960)
(_DataLine2=1,1000,0,0,16776960)
(_DataDot3=1,300,0,3,255)
(_DataLine3=1,1000,0,0,255)
(_DataDot4=1,300,0,3,16711935)
(_DataLine4=1,1000,0,0,16711935)
(_DataDot5=1,300,0,3,8388863)
(_DataLine5=1,1000,0,0,8388863)
[LEND]*/
// [BODY]
//這里是代碼窗口,請將Forcal代碼寫在下面
i: OutVector(p:k,i)= k=FCDLen(p),printff{"\r\n"},i=0,(i
{"\r\n"};? ? //輸出一維數組
!using["XSLSF"]; //使用命名空間XSLSF
f(t,x,y,z,dx,dy,dz::p1,p2,p3)={ //函數定義,連分式法對微分方程組積分一步函數pbs1中要用到
dx=p1*(20-x)+p2*(p3-x),
dy=p1*(x-y)+p2*(p3-y),
dz=p1*(y-z)+p2*(p3-z)
};
t_i_2(hf,a,step,eps,t1,t2,x_1,x_2,x_3:x1,x2,x3,h,i)=? ? //用于計算目標函數
{
h=(t2-t1)/step,
{? ?pbs1[hf,t1,a,h,eps],??//連分式法對微分方程組積分一步函數pbs1,hf為函數f的句柄
t1=t1+h
}.until[abs(t1-t2)
a.getra(0,&x1,&x2,&x3),
(x1-x_1)^2+(x2-x_2)^2+(x3-x_3)^2
};
J(_p1,_p2,_p3 : t1,s,i : hf,Array,step,eps,p1,p2,p3,數據)={? ? //目標函數定義
p1=_p1,p2=_p2,p3=_p3,
t1=0, Array.setra(0,10,15,20),
s=0,i=0,
(i<30).while{
s=s+t_i_2[hf,Array,step,eps: &t1, 數據.getrai(i,0) : 數據.getrai(i,1),??數據.getrai(i,2),??數據.getrai(i,3)],
i++
},
s
};
驗證(_p1,_p2,_p3 : t1,s1,s2,s3,i max: hf,Array,step,eps,p1,p2,p3,數據)={? ? //驗證函數定義
p1=_p1,p2=_p2,p3=_p3,
t1=0, Array.setra(0,10,15,20),
i=0, printff{"\r\n? ? No? ?? ?? ?? ?? ? 目標x? ?? ?? ?? ?? ?? ?計算x? ?? ?? ?? ?? ???目標y? ?? ?? ?? ?? ???計算y? ?? ?? ?? ?? ???目標z? ?? ?? ?? ?? ???計算z\r\n\r\n"},
(i<30).while{
t_i_2[hf,Array,step,eps: &t1, 數據.getrai(i,0) : 數據.getrai(i,1),??數據.getrai(i,2),??數據.getrai(i,3)],
Array.getra(0,&s1,&s2,&s3),
printff{"{1,r,6.3}{2,r,22.16}{3,r,22.16}{4,r,22.16}{5,r,22.16}{6,r,22.16}{7,r,22.16}\r\n",數據.getrai(i,0),數據.getrai(i,1),s1,數據.getrai(i,2),s2,數據.getrai(i,3),s3},
i++
},
//將理論數據保存到3、4、5號緩沖區
max=300,
SetDataLen(3,max),SetDataLen(4,max),SetDataLen(5,max),
i=1,t1=0, Array.setra(0,10,15,20),SetDatai(3,0,0,10),SetDatai(4,0,0,15),SetDatai(5,0,0,20),
(i
t_i_2[hf,Array,step,eps: &t1, i/10 : 0,??0,??0],
Array.getra(0,&s1,&s2,&s3),
SetDatai(3,i,i/10,s1),SetDatai(4,i,i/10,s2),SetDatai(5,i,i/10,s3),
i++
}
};
main(:d,u,v,x,_eps,k,xx,g,i,s1,s2,s3:hf,Array,step,eps,數據)=
{
hf=HFor("f"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//模塊變量hf保存函數f的句柄,預先用函數HFor獲得該句柄
數據=new[rtoi(real_s),rtoi(30),rtoi(4),rtoi(EndType),
1, 11.80, 15.37, 20.77,
2, 14.04, 17.04, 22.23,
3, 15.44, 16.85, 21.16,
4, 17.80, 18.07, 22.49,
5, 18.60, 19.43, 24.46,
6, 19.22, 20.12, 23.58,
7, 21.77, 21.83, 24.51,
8, 22.17, 22.11, 25.38,
9, 23.41, 23.37, 25.53,
10, 23.17, 24.92, 26.69,
11, 24.56, 25.55, 29.21,
12, 25.85, 26.06, 28.00,
13, 24.64, 28.94, 30.32,
14, 25.15, 28.94, 30.41,
15, 26.92, 30.06, 31.87,
16, 26.37, 29.29, 31.87,
17, 26.71, 31.48, 34.60,
18, 26.61, 31.86, 33.57,
19, 27.13, 33.84, 36.75,
20, 29.32, 32.95, 36.36,
21, 28.24, 33.03, 36.23,
22, 28.42, 32.50, 36.01,
23, 28.11, 33.12, 39.19,
24, 28.98, 35.32, 37.29,
25, 30.23, 35.56, 37.79,
26, 30.21, 34.86, 42.05,
27, 29.11, 35.40, 42.67,
28, 30.42, 36.20, 40.74,
29, 28.84, 35.91, 40.53,
30, 29.44, 36.50, 43.33
],
Array=new[rtoi(real_s),rtoi(45)],? ?? ?? ?? ?//申請工作數組
step=30,eps=1e-7,? ?? ?? ?? ?? ?? ?? ?? ?? ? //積分步數step越大,積分精度eps越小越精確,用于對微分方程組積分一步函數pbs1
x=new[rtoi(real_s),rtoi(4)],? ?? ?? ?? ?? ???//申請工作數組
xx=new[rtoi(real_s),rtoi(3),rtoi(4)],? ?? ???//申請工作數組
g=new[rtoi(real_s),rtoi(4)],? ?? ?? ?? ?? ???//申請工作數組
_eps=1e-100, d=1,u=1.6,v=0.4,k=800,? ?? ?? ???//變換d、u、v進一步求解,k為允許的最大迭代次數
i=jsim[HFor("J"),d,u,v,x,_eps,k,xx,g],? ?? ? //求n維極值的單形調優法
printff{"\r\n實際迭代次數={1,r}\r\n",i},? ???//輸出實際迭代次數
OutVector[x],? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???//輸出最優參數值及目標函數終值
x.getra(0,&s1,&s2,&s3),
驗證[s1,s2,s3],
delete[x],delete[xx],delete[g],delete[Array],delete[數據] //銷毀申請的對象
};
SetData{0, //導入的數據保存在0號緩沖區
1, 11.80,
2, 14.04,
3, 15.44,
4, 17.80,
5, 18.60,
6, 19.22,
7, 21.77,
8, 22.17,
9, 23.41,
10, 23.17,
11, 24.56,
12, 25.85,
13, 24.64,
14, 25.15,
15, 26.92,
16, 26.37,
17, 26.71,
18, 26.61,
19, 27.13,
20, 29.32,
21, 28.24,
22, 28.42,
23, 28.11,
24, 28.98,
25, 30.23,
26, 30.21,
27, 29.11,
28, 30.42,
29, 28.84,
30, 29.44
};
_DataDot0(mod,x)=GetData(0,mod,&x); //繪制數據點
_DataLine0(x)=GetData(0,2,x); //繪制數據線
SetData{1, //導入的數據保存在1號緩沖區
1,??15.37,
2, 17.04,
3,??16.85,
4,??18.07,
5,??19.43,
6,??20.12,
7,??21.83,
8, 22.11,
9,??23.37,
10,??24.92,
11,??25.55,
12,??26.06,
13,??28.94,
14, 28.94,
15, 30.06,
16,??29.29,
17, 31.48,
18,??31.86,
19, 33.84,
20,??32.95,
21,??33.03,
22,??32.50,
23,??33.12,
24, 35.32,
25,??35.56,
26,??34.86,
27,??35.40,
28,??36.20,
29, 35.91,
30,??36.50
};
_DataDot1(mod,x)=GetData(1,mod,&x); //繪制數據點
_DataLine1(x)=GetData(1,2,x); //繪制數據線
SetData{2, //導入的數據保存在1號緩沖區
1,??20.77,
2,??22.23,
3,??21.16,
4, 22.49,
5,??24.46,
6,??23.58,
7, 24.51,
8,??25.38,
9,??25.53,
10,??26.69,
11, 29.21,
12, 28.00,
13,??30.32,
14,??30.41,
15,??31.87,
16, 31.87,
17,??34.60,
18,??33.57,
19,??36.75,
20,??36.36,
21, 36.23,
22, 36.01,
23,??39.19,
24,??37.29,
25,??37.79,
26,??42.05,
27, 42.67,
28,??40.74,
29,??40.53,
30,??43.33
};
_DataDot2(mod,x)=GetData(2,mod,&x); //繪制數據點
_DataLine2(x)=GetData(2,2,x); //繪制數據線
_DataDot3(mod,x)=GetData(3,mod,&x); //繪制理論數據點
_DataLine3(x)=GetData(3,2,x); //繪制理論數據線
_DataDot4(mod,x)=GetData(4,mod,&x); //繪制理論數據點
_DataLine4(x)=GetData(4,2,x); //繪制理論數據線
_DataDot5(mod,x)=GetData(5,mod,&x); //繪制理論數據點
_DataLine5(x)=GetData(5,2,x); //繪制理論數據線