|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
#include <stdio.h>
#include <math.h>
#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 lamet,niu,ans,t1,t2;
lamet = w*a+(1-w)*b;
niu = a+b-lamet;
for(int k=1;k<=max;k++){
t1=f(lamet);
t2=f(niu);
if (f(lamet)<f(niu)){
b = niu;
niu = lamet;
lamet = a+b-niu;
}
else{
a = lamet;
lamet = niu;
niu = a+b-lamet;
}
}
double cha = fabs(b-a);
if (fabs(b-a)<e){
ans = (a+b)/2;
return ans;
}
return 0;
}
double f(double x){
return exp(x)-log(x);
}
int main(){
double a0=0.5,b0=1.5,max=50;
double ans;
ans = gold(f,a0,b0,max);
printf("%lf",ans);
return 0;
}
//最后的结果就是,我的ab之间距离越来越大,不知道为什么。。。
1. 你的迭代公式有误。在黄金分割法中,每次迭代后,你需要更新区间的两个端点,而不是更新`a`和`b`的值。
2. 你的`f(lamet)`和`f(niu)`的比较逻辑有误。你应该比较`f(lamet)`和`f(niu)`的值,而不是比较`lamet`和`niu`。
3. 你的终止条件判断有误。你应该在循环结束后,判断`b-a`是否小于精度`e`,而不是在循环内部。
试一下看看#include <stdio.h>
#include <math.h>
#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 lamet,niu,ans;
lamet = w*a+(1-w)*b;
niu = a+b-w*a;
for(int k=1;k<=max;k++){
double t1=f(lamet);
double t2=f(niu);
if (t1 < t2){
b = lamet;
lamet = niu;
niu = a+b-w*b;
}
else{
a = niu;
niu = lamet;
lamet = b-w*(b-a);
}
}
double cha = fabs(b-a);
if (cha < e){
ans = (a+b)/2;
return ans;
}
return 0;
}
double f(double x){
return exp(x)-log(x);
}
int main(){
double a0=0.5,b0=1.5,max=50;
double ans;
ans = gold(f,a0,b0,max);
printf("%lf",ans);
return 0;
}
|
|