📄 进退法.c
字号:
/*用于确定目标函数初始搜索区间,文件名jtf.c*/
/*输出变量:a:n维数组,搜索区间的下限*/
/* b:n维数组,搜索区间的下限*/
/*输入变量:x0:n维数组,搜索初始点*/
/* h0:初始步长*/
/* s:n维数组,搜索方向*/
/* n:优化模型维数*/
#include "funct.c"
#include "stdio.h"
#include "stdlib.h"
woid jtf(double x0[],double h0,double s[],int n,double a[],double b[])
{
int i;
double *x[3],h,f1,f2,f3;
for(i=0;i<3,i++)/*给三个局部变量分配内存空间*/
x[i]=(double*)malloc(n*sizeof(double));
h=h0;
for(i=0;i<n;i++)
*(x[0]+i)=x0[i];
f1=funct(x[0]);
for(i=0;i<n;i++)
*(x[1]+i)=*(x[0]+i)+h*s[i];
f2=funct(x[1]);
if(f2>f1) /*如果前进方向函数值变大,则换方向*/
{
h=-h0;
for(i=0;i<n;i++)
*(x[2]+i)=*(x[0]+i);
f3=f1;
for(i=0;i<n;i++)
{
*(x[0]+i)=*(x[1]+i);
*(x[1]+i)=*(x[2]+i);}
f1=f2;
f2=f3;
}
for(;;) /*如果函数值下降,则加大步长*/
{
h=2.0*h;
for(i=0;i<n;i++)
*(x[2]+i)=*(x[1]+i)+h*s[i];
f3=funct(x[2]);
if(f2<f3)
break;
else
{for(i=0;i<n;i++)
{*(x[0]+i)=*(x[1]+i);
*(x[1]+i)=*(x[2]+i);
}
f1=f2;
f2=f3;
}
}
if(h<0.0)
for(i=0;i<n;i++)
{a[i]=*(x[2]+i);
b[i]=*(x[0]+i);
}
else
for(i=0;i<n;i++)
{a[i]=*(x[0]+i);
b[i]=*(x[2]+i);
}
for(i=0;i<3;i++) /*释放内存空间*/
free(x[i]);
}
/*1.目标函数子程序,文件名 funct.c*/
/*输出:目标函数值*/
/*输入变量:设计变量数组*/
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
double funct(double x[])
{
double ff;
ff=3*pow(x[0],3)-8*x[0]+9;
return(ff);
}
/*进退法主程序,文件名mjtf.c*/
#include "jtf.c"
void main()
{
double x0[]={0};
double s[]={1};
double a[1],b[1];
jtf(x0,0.1,s ,1,a,b,);
printf("初始区间:\n”);
printf("a[]=%f,b[]=%f\n",a[0],b[0]);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -