изменение метода Regula Falsi для метода секущих - PullRequest
1 голос
/ 09 июня 2011

Я применил метод 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;
  }
}

Ответы [ 3 ]

1 голос
/ 09 июня 2011

Для секущего метода проще не найти рут.Вы уверены, что это должно найти это?

Для тестирования приведу пример: http://www.mathcs.emory.edu/ccs/ccs315/ccs315/node18.html (пример 4.7). Вы хотите запустить этот пример (f (x) = x ^ 6-x-1, x0 = 1 x1= 2, корень х = 1,374)

0 голосов
/ 09 апреля 2014

Secant метод - метод открытых скобок, тогда как Regula-Falsi - тип закрытых скобок. Итак, ваш PDF правильный. Чтобы изменить метод Regula-Falsi на метод secant, вы должны изменить закрытый квадрат на открытый тип.

См. пример использования метода Регула-Фальси . Здесь кодирование таково, что один интервал всегда остается постоянным.

Вот пример программы для метода Secant . Здесь, как и в методе Regula, используются две начальные догадки, но оба интервала продолжают изменяться, пока не будет получен правильный корень. Получить первые два предположения вручную.

И, что касается скорости сходимости, для метода Секанта он является суперлинейным, тогда как для Регулы он является линейным. Итак, секущий метод сходится намного быстрее.

0 голосов
/ 10 июня 2011

Либо PDF неверен, либо вы его неправильно поняли.Не читая PDF, невозможно сказать, что или объяснить дальше.Когда я объясняю оба метода, я говорю, что разница между regula falsi и secant method - это правило для обновления a и b.

Вычислите первые две итерации метода secant вручную.Затем измените вашу программу для печати значений a, b и m на каждой итерации (или используйте отладчик).Это должно дать вам подсказку о том, что происходит.

В вашем примере секущий метод должен сходиться за несколько итераций.

...