gpt4 book ai didi

c - 将 regula falsi 方法修改为割线方法

转载 作者:太空宇宙 更新时间:2023-11-04 04:05:41 25 4
gpt4 key购买 nike

我已经实现了 regula falsi 方法。我正在尝试对其进行修改,使其成为正割法。我读过的一份 pdf 提到它基本上是一样的,只是一个变化。 future 对我的“m”值的猜测应该有一个稍微不同的公式,而不是:

m = a - f(a) * ( (b-a)/( f(b)-f(a) ) );

应该是:

m = a - f(a) * ( (m-a)/( f(m)-f(a) ) );

但不幸的是它不起作用(它永远找不到根)。我应该如何解决才能将其纳入正割法?

源码如下:

#include <stdio.h>
#include <math.h>


void
secant(double a, double b, double e, double (*f)(double), int maxiter ) {
double m, fm, fa, fb;
int i;

fa=(*f)(a);
fb=(*f)(b);

m = a - fa * ( (b-a)/( fb - fa ) );

fm=(*f)(m);


for(i=0; i<maxiter; i++) {
if ( fabs(fm) <= e ) {
printf("f(%f) = %f\n", m, fm);
return;
} else if ((fa*fm) < 0) {
b=m;
fb=fm;
} else {
a=m;
fa=fm;
}

// the guess below works for regula falsi method:
// m = a - fa * ( (b-a)/(fb - fa));

//this was supposed to be the change to turn this into the secant method
m = a - fa * ( (m-a)/(fm - fa) );

fm=(*f)(m);
}
}

int main(){
secant(1,4,0.0001,sin,500);
return 0;
}

提前致谢

编辑:好的,在玩弄笔和纸之后,我终于明白了,这并不像我最初想的那样是一个简单的改变:

void secant(double a, double b, double e, double (*f)(double), int maxiter ) {
double m, fm, fa, fb;
int i;
fa=(*f)(a);
fb=(*f)(b);

for(i=0; i<maxiter; i++) {
m = a - fa * ( (b-a)/(fb - fa) );
fm=(*f)(m);
if ( fabs(fm) <= e ) {
printf("f(%f)=%f, iter: %d\n", m,fm,i);
return;
}
a=b;
b=m;
fa=fb;
fb=fm;
}
}

最佳答案

割线法更容易求不到根。你确定它应该找到它吗?

为了测试,这里有一个例子:http://www.mathcs.emory.edu/ccs/ccs315/ccs315/node18.html(示例 4.7)您想要运行该示例( f(x)=x^6-x-1 , x0=1 x1=2, root x=1.347)

关于c - 将 regula falsi 方法修改为割线方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6297218/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com