📄 steep1.c~
字号:
#include<stdio.h>#include<math.h>#include<stdlib.h>#define N 1000 /* ITERATIONS */ double grad1,grad2,grad3;double gradient (double x1,double x2,double x3,int i);double main_function(double a,double x1,double grad1,double x2,double grad2,double x3,double grad3);double alfa(double x1,double grad1,double x2,double grad2,double x3,double grad3);double alfa(double x1,double grad1,double x2,double grad2,double x3,double grad3){ double a[100], b[100], fxa, fxb, minimum; int i=0; a[0]=-10; b[0]=10; do{ i++; a[i] = a[i-1]+0.3819*(b[i-1]-a[i-1]); b[i] = b[i-1]-0.3819*(b[i-1]-a[i-1]); fxa = main_function(a[i],x1,grad1,x2,grad2,x3,grad3); fxb = main_function(b[i],x1,grad1,x2,grad2,x3,grad3); if(fxa < fxb){ a[i]=a[i-1]; b[i]=b[i]; if(fabs(b[i]-a[i]) < 0.0000001){ minimum=a[i]; break; } } else{ a[i] = a[i]; b[i]=b[i-1]; if(fabs(b[i]-a[i]) < 0.0000001){ minimum=b[i]; break; } } } while(fabs(b[i]-a[i]) > 0.0000001); printf("Alfa =%lf\n", minimum); return minimum;}double main_function(double a,double x1,double grad1,double x2,double grad2,double x3,double grad3){ double s = x1 -a*grad1 - 4; double t = x2 -a*grad2 - 3; double u = x3 -a*grad3 + 5; return (pow(s,4) + pow(t,2) + 4*pow(u,4));}double gradient(double x1,double x2,double x3, int i){ if (i == 0) { return (4*pow((x1- 4),3)); }else if (i == 1) { return (2*(pow((x2-3),1))); }else if (i == 2) { return (16*pow((x3+5),3)); } return i;}int main (int argc,char*argv[]){ double a; /* ALFA*/ int i,j, k; double x[N][3]; double eps = 0.0001; double grad[3]; if (argc != 3+1) { printf("Please enter the initial 3 guesses.\n"); exit(0); } for (i=0;i<1;i++) { for (j=0;j<=(2);j++) { sscanf(argv[j+1],"%lf",&x[i][j]); printf("\nThe intial guess x[%d][%d] is %lf",i,j,x[i][j]); } } printf("\n"); j = 0; for (i=0; i<=N;i++) { for(k=0;k<=2;k++){ grad[k]= gradient ((x[i][j]),(x[i][j+1]),(x[i][j+2]),k); } a = alfa(x[i][j],grad[0],x[i][j+1],grad[1],x[i][j+2],grad[2]); printf("%lf\t%lf\t%lf\t\n",grad[0],grad[1],grad[2]); x[i+1][j] = x[i][j] - a * grad[0]; x[i+1][j+1] = x[i][j+1] - a * grad[1]; x[i+1][j+2] = x[i][j+2] - a * grad[2]; printf("\nx[%d][%d]:%lf\t,x[%d][%d]:%lf\t,x[%d][%d]:%lf\n",i+1,j+1,(x[i+1][j]),i+1,j+2,(x[i+1][j+1]),i+1,j+3,(x[i+1][j+2])); if (fabs(x[i+1][j] - x[i][j]) < eps && fabs(x[i+1][j+1] - x[i][j+1]) < eps && fabs(x[i+1][j+2] - x[i][j+2]) < eps) { printf("\nx1: %lf\t,x2: %lf\t,x3: %lf\n",(x[i][j]),(x[i][j+1]),(x[i][j+2])); exit(0); } } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -