你的代码几乎是正确的,但是有一些小错误导致结果不正确。
首先,你漏掉了循环的结束条件。在黄金分割法中,需要设置一个最大迭代次数,当达到最大迭代次数时,应该停止循环。
修改后的代码如下:
#include <iostream>
#include <cmath>
#define w 0.6180339887
#define e 1e-6
double gold(double(*f)(double),double a0,double b0,int max){
double a = a0, b = b0;
double lambda,nu,ans,t1,t2;
lambda = w*a+(1-w)*b;
nu = a+b-lambda;
for(int k=1;k<=max;k++){
t1 = f(lambda);
t2 = f(nu);
if(t1 > t2){
a = lambda;
lambda = nu;
nu = a+b-lambda;
}
else{
b = nu;
nu = lambda;
lambda = w*a+(1-w)*b;
}
if(fabs(a-b)<e){
break;
}
}
ans = (a+b)/2;
return ans;
}
double func(double x){
return pow(x-1,2);
}
int main(){
double a = -10, b = 10;
int max_iter = 100;
double result = gold(func, a, b, max_iter);
std::cout << "The minimum point is: " << result << std::endl;
return 0;
}
这段代码可以求解函数f(x) = (x - 1)^2 在区间[-10, 10]上的最小值点。
希望这个回答对你有帮助!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |