C语言 黄金分割法确定极小值
标签:const amp ati while void 指针 ret else turn
#include
#include
#define F(x) (3*x*x*x-4*x+2)
double fun1(double x);
void goAndBackSectionPrint(double x1, double h, double (*f)(double), double *ret1, double *ret2);
void goldenSecton(double x0, double h, double (*f)(double), double e);
int main(void){
goldenSecton(0, 1, fun1, 0.1);
return 0;
}
//进退法打印区间
//x1 搜索初值
//h 搜索步长
//f 待搜索函数f(x)的指针
//ret1 ret2 返回区间指针
void goAndBackSectionPrint(double x1, double h, double (*f)(double), double *ret1, double *ret2){
double a1 = x1;
double y1 = (*f)(a1);
double a2 = a1 + h;
double y2 = f(a2);
double a3 = 0;
double y3 = 0;
if(y2 > y1){
h = -h;
a3 = a1;
y3 = y1;
a1 = a2;
y1 = y2;
a2 = a3;
y2 = y3;
}
a3 = a2 + h;
y3 = f(a3);
while(y3 = y2){
a = a1;
a1 = a2;
y1 = y2;
a2 = a + ratio*(b - a);
y2 = f(a2);
}
else{
b = a2;
a2 = a1;
y2 = y1;
a1 = b - ratio*(b - a);
y1 = f(a1);
}
}while((fabs((b-a)/b) >= e) || (fabs((y2-y1)/y2) >= e));
printf("a = %f, f(a) = %f.\n", a, f(a));
printf("b = %f, f(b) = %f.\n", b, f(b));
double minVal = (a+b)/2;
printf("函数的最小值点为:%f。\n", minVal);
printf("函数的最小值为: %f。\n", f(minVal));
}
double fun1(double x){
return F(x);
}
C语言 黄金分割法确定极小值
标签:const amp ati while void 指针 ret else turn
原文地址:https://www.cnblogs.com/ritchie0307/p/12964067.html
评论