常微分方程组的参数估值(整整弄了一个月没解决!望高手帮帮忙)
znpmg 2005-01-19 03:26:53 先用Treanor法解常微分方程的数值解,然后用DFP法(求解无约束n元函数的极值问题)寻优。
#include <stdio.h>
#include <math.h>
#include "stdlib.h"
#define MAX_N 10
#define MAX_ITERATE 3000
#define DEBUG 1
double y[2];
double result[2][8];
double DFP(int N,double XK[],double EPS,double(*f)(int ,double[]));
double Parab(int N,double X0[],double P[],double H,double EPS,double (*f)(int ,double[] ),double* TM,double X[]);
void gtnr2(double t,double h,int n,double y[],int k,double x[],double z[]);
/*----------------测试函数-----------------------------*/
double OBF_For_DFP(int N,double X[]);
void testTreanor();
double AimFunction(double z[2][8]);
double OBF_For_Treanor(int N,double x[]);
/*----For testing Parab-----*/
double OBF_For_Parab(int N,double X[])
{
double FX=0.0,X1;
int i;
for(i=0;i<N;i++)
{
X1=X[i]-(i+1);
FX=FX+X1*X1;
}
return FX;
}
void testParab()
{
int N;
double EPS,FX,H,TM;
double X0[MAX_N],P[MAX_N],X[MAX_N];
int i;
N=5;
for(i=0;i<N;i++)
{
X0[i]=1;
P[i]=(i+1)/10.0;
}
H=1;
EPS=1.0E-7;
TM=7;
FX=Parab(N,X0,P,H,EPS,OBF_For_Parab,&TM,X);
printf("\n\nThe test result of Parab as following:\n");
printf("TM=%f,FX=%f\n",TM,FX);
for(i=0;i<N;i++)
printf("X[%d]=%f\t",i+1,X[i]);
}
/*----For testing DFP-----*/
double OBF_For_DFP(int N,double X[])
{
double f1,f2,f3;
/*f1= X[0]-8;
f2= X[1]-1;//+5*sin(X[0]);
f3=X[2]-cos(X[2]);
//f3=1.0/2-cos(X[2]);
return f1*f1+f2*f2+f3*f3;
*/
f1=X[1]-X[0]*X[0];
f2=1-X[0];
return 100*f1*f1+f2*f2;
}
void testDFP()
{
int N;
double EPS,FX;
double XK[MAX_N];
int i;
N=2;
EPS=1.0E-10;
//for(i=0;i<N;i++)
// XK[i]=1;
XK[0]=-1.2;
XK[1]=1.5;
FX=DFP(N,XK,EPS,OBF_For_DFP);
printf("The test result of DFP as following:\n");
for(i=0;i<N;i++)
printf("XK[%d]=%1.30f\t",i+1,XK[i]);
printf("\nFX=%1.30f\n",FX);
}
/*------For test Treanor------------------*/
void testTreanor()
{
int i,j;
double x[8];
double f;
y[0]=0;
y[1]=0;
x[0]=0.1151;
x[1]=2.45;
x[2]=0.02;
x[3]=0.3047;
x[4]=2.75;
x[5]=0.008;
x[6]=0.85;
x[7]=0.51;
f=OBF_For_Treanor(8,x);
while(f>0.1)
{
printf("f=%f\n",f);
for(i=0;i<8;i++)
{
printf("result[0][%d]=%f\tresult[1][%d]=%f\n",i,result[0][i],i,result[1][i]);
}
DFP(8,x,1.0e-10,OBF_For_Treanor);
for(i=0;i<8;i++)
printf("x[%d]=%f\t",i,x[i]);
y[0]=0;
y[1]=0;
f=OBF_For_Treanor(8,x);
}
for(i=0;i<8;i++)
printf("x[i]=%f",x[i]);
}
double AimFunction(double z[2][8])
{
double A[2][8];
double f;
int i,j;
double x[8];
f=0.0;
A[0][0]=0.074;
A[0][1]=0.323;
A[0][2]=0.295;
A[0][3]=0.319;
A[0][4]=0.315;
A[0][5]=0.311;
A[0][6]=0.289;
A[0][7]=0.294;
A[1][0]=0.515;
A[1][1]=0.592;
A[1][2]=0.684;
A[1][3]=0.667;
A[1][4]=0.704;
A[1][5]=0.723;
A[1][6]=0.765;
A[1][7]=0.773;
for(i=0;i<8;i++)
{
f+=(z[0][i]-A[0][i])*(z[0][i]-A[0][i]);
f+=(z[1][i]-A[1][i])*(z[1][i]-A[1][i]);
}
return f;
}
double OBF_For_Treanor(int N,double x[])
{
int i;
double t,h,z[2][101];
double f;
t=0.0;
h=2;
gtnr2(t,h,2,y,101,x,z);
result[0][0]=z[0][0];
result[1][0]=z[1][0];
for(i=0;i<7;i++)
{
result[0][i+1]=z[0][i*15+5];
result[1][i+1]=z[1][i*15+5];
}
/*for(i=0;i<8;i++)
{
printf("result[0][%d]=%f\tresult[1][%d]=%f",i,result[0][i],i,result[1][i]);
}*/
return AimFunction(result);
}
void gtnr2f(t,y,n,x,d)
int n;
double t,y[],d[],x[];
{
d[0]=x[0]*pow((0.8947-y[0]-y[1]),x[1])*pow((0.726-y[0]-y[1]),x[2])-x[3]*pow(y[0],x[4]);
d[1]=x[5]*pow((0.8947-y[0]-y[1]),x[6])*pow((0.726-y[0]-y[1]),x[7]);
return;
}
int main()
{
// testParab(); /*用例子中的函数测试Parab函数*/
// testDFP(); /*用例子中的函数测试DFP函数*/
testTreanor();
// getch();
return 0;
}