//若长时间没有结果,在任意可接受输入的窗口,按Ctrl+Alt+q退出Forcal运行。
!using["XSLSF","sys","io"]; //使用命名空间XSLSF、sys和io
//输出一维数组,该函数看不懂不要紧。将%14.6e改为%25.16e可提高输出精度
i: OutVector(p:k,i)= k=FCDLen(p),printf{"\r\n"},i=0,(i
//函数定义,用于计算微分方程组中各方程右端函数值,连分式法对微分方程组积分一步函数pbs1中要用到
//该表达式有2*n+1个参数,第一个参数为自变量,随后n个参数为函数值,最后n个参数为右端函数值(即微分方程的值)。
//n为微分方程组中方程的个数,也是未知函数的个数。
//两个冒号后的5个参数是模块变量,在这里,所有的函数属于同一个模块;模块变量在同一模块的函数内有相同的地址。
//5个模块变量k12,k21,k23,k32,k30就是拟合参数,要预先赋值,这是Forcal中通过模块变量传递参数的方法
f(t,X1,X2,X3,dX1,dX2,dX3::k12,k21,k23,k32,k30)={
dX1=-k12*X1+k21*X2,
dX2=(-k21-k23)*X2+k12*X1+k32*X3,
dX3=(-k32-k30)*X3+k23*X2
};
//用于计算目标函数:对微分方程组从t1积分到t2;x_1,x_2,x_3为实验值
//两个冒号之间的x1,x2,x3,h,i为动态变量
//两个冒号之后的都是模块变量:hf为函数f的句柄;Array为工作数组;step为积分步数;eps控制精度。这些参数要预先赋值
t_i_2(t1,t2,x_1,x_2,x_3:x1,x2,x3,h,i:hf,Array,step,eps)=
{
h=(t2-t1)/step, //计算积分步长
{ pbs1[hf,t1,Array,h,eps], //连分式法对微分方程组积分一步函数pbs1
t1=t1+h //积分步长增加
}.until[abs(t1-t2)
Array.getra(0,&