📄 最优化方法-插值法求最小值.c
字号:
#include"stdio.h"
#include"iostream.h"
#include"math.h"
double e,f,g,h;
double n=10.0;
double FuncTion(double a6){
double y,z,u;
z=1-a6;
u=30*a6;
y=(-1)*sin(a6)*sin(a6)*sin(a6)*sin(a6)*sin(a6)*sin(a6)*tan(z)*exp(u);
return y;}
double FindThreP(double a5,double b5){
double d;
int flag,i;
e=a5;g=b5;
for(i=1;i<=9;i++){
d=a5+i*(((b5-a5))/10.0);
if(FuncTion(a5)>FuncTion(d)&&FuncTion(b5)>FuncTion(d)){
f=d;flag=1;break;
}
}
if(i==10&&flag!=1)printf("error");
return 0;}
double FindMinX(double a,double b,double c){
double r,u;
r=0.5*((b*b-c*c)*(FuncTion(a))+(c*c-a*a)*(FuncTion(b))+(a*a-b*b)*(FuncTion(c)));
u=(b-c)*(FuncTion(a))+(c-a)*(FuncTion(b))+(a-b)*(FuncTion(c));
r=r/u;
h=r;
return 0;
}
double IsMinX(double a,double b,double c,double d){
double a1,a2,a3,a4;
a1=FuncTion(a);
a2=FuncTion(b);
a3=FuncTion(c);
a4=FuncTion(d);
if((fabs(a2-a4)<=(fabs(a2)*0.001))/*&&((fabs(a2)>0.00001))*/||(fabs(a2-a4)<=0.001)&&(fabs(a2)<0.00001)){
if(a4<a2)return d;
else return b;
}
if(d>b){
if(a4<a2){
e=b;f=d;
}
else {
g=d;
}
}
else {if(a4<a2){
g=b;f=d;
}
else{e=d;
}
}
return -1;}
int main(){
int n=1;
double t;
FindThreP(0.0,1.0);
printf("%f %f %f",e,f,g);
loop:FindMinX(e,f,g);
if((t=IsMinX(e,f,g,h))==-1.0){
n=n+1;
if(n>10000){
printf("may be some error");return 0;
}
printf("%f %f %f",e,f,g);
goto loop;}
//}
else printf("%f",t);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -