机械优化设计黄金分割法 外推法(3)
时间:2026-01-17
时间:2026-01-17
运行过程及结果:
输入a,b值和精度e值
-3 5
0.0001
a=3.279466,b=3.279793,s=22.659008,m=3.279629,n=21
3.二次插值法
源程序:
#include<stdio.h> #include<math.h> int main(void) {
double a1,a2,a3,ap,y1,y2,y3,yp,c1,c2,m; double j[3]; int i,h=1;
void finding(double a[3]); finding(j);
a1=j[0];
a2=j[1]; a3=j[2];
m=0.001;
double f(double x);
y1=f(a1); y2=f(a2); y3=f(a3);
for(i=1;1>=1;i++) {
c1=(y3-y1)/(a3-a1);
c2=((y2-y1)/(a2-a1)-c1)/(a2-a3); ap=0.5*(a1+a3-c1/c2); yp=f(ap);
if(fabs((y2-yp)/y2)<m) break;
else if((ap-a2)*h>0) {
if(y2>=yp){ a1=a2;y1=y2; a2=ap;y2=yp;} else{
a3=ap;y3=yp;}
}
else if(y2>=yp){ a3=a2;y3=y2; a2=ap;y2=yp;} else{a1=ap;y1=yp;} }
double x,y; if(y2<=yp){ x=a2;y=y2;} else{
x=ap;y=yp;}
printf("a*=%f\n",x); printf("y*=%f\n",y);
return 0; }
double f(double x) {
double y;
y=x*x-10*x+36; return y; }
void finding(double a[3]) {
int h,i;
double y[3]; a[0]=0; h=1;
a[1]=h;
y[0]=f(a[0]);y[1]=f(a[1]); if(y[1]>y[0]) {
h=-h;
a[2]=a[0];y[2]=y[0]; do{
a[0]=a[1];a[1]=a[2]; y[0]=y[1];y[1]=y[2]; a[2]=a[1]+h;y[2]=f(a[2]); h=2*h;
}while(y[2]<y[1]); }
else{
for(i=1;i>=1;i++){
a[2]=a[1]+h;y[2]=f(a[2]); if(y[2]>=y[1]) break;
上一篇:平翘舌音练习材料大全
下一篇:电化学理论(李狄)课后答案解析