Nano Hash - криптовалюты, майнинг, программирование

изменение метода regula falsi на метод секущих

Я реализовал метод 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;
  }
}
09.06.2011

  • не работает? Не могли бы Вы уточнить? Вылетает ли программа, не сходится ли она, сходится ли она слишком медленно, есть ли предельный цикл или она улетает в бесконечность? Или еще что-то происходит... 09.06.2011
  • Упс. Я только что пояснил, что он не находит корень функции 09.06.2011

Ответы:


1

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

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

09.06.2011
  • спасибо, только что протестировал его, и метод секущих занимает 6 итераций, тогда как первоначальный метод regula falsi занял 1360, поэтому я думаю, что он работает так, как рекламируется 10.06.2011

  • 2

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

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

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

    10.06.2011

    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..