我已经实现了regula-falsi方法。我试图修改它,使之成为割线法。我读过的一个pdf文件提到,只要做一个更改,它就基本上是一样的。
未来对“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,rootx=1.347)

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

10-12 23:18