Методы решения нелинейных уравнений - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток! Знаю что тема уже довольно избита, но вопросы по ней всё таки имеются. Если быть точнее, то вопрос касательно двух простых методов - Ньютона и простой итерации. Делаю по аналогам, которые находил в интернете, но возникает 2 проблемы, которые не удается решить: 1. Метод Ньютона уходит в бесконечный цикл; 2. Метод простой итерации выдает бесконечность в большинстве случаев или выдает какую то хрень. Собственно вот код:
 
        // Вычисляемое уравнение
        static double equat(double x)
        {
            return Math.Pow(x, 2) - Math.Cos(Math.PI / x);
        }
        
        // Его производная
        static double equatDiverative(double x)
        {
            return 2 * x + (1 / x);
        }
 
        public static void MethodNewton()
        {
            int n = 0;
            double x0, eps = 0.001, x = 1.2;
 
            Console.WriteLine("x0 = {0}\neps = {1}", x, eps);
 
            do
            {
 
                x0 = x - equat(x) / equatDiverative(x);
                x = x0;
                n++;
 
            } while (Math.Abs(equat(x)) >= eps);
 
            Console.WriteLine("Result: {0}\nIterat: {1}", x, n);
        }
За пару лет до этого, приходилось делать то же самое, только на С++ и алгоритм немного отличался. Я его переписал под шарп и результат всё тот же. Вот код:
            do
            {
                x = x - equat(x) / equatDiverative(x);
                n++;
            } while (Math.Abs(equat(x)) >= eps);
И вот метод простой итерации тоже в двух вариантах:
public static void MethodIterat()
        {
            int n = 0;
            double a = 1.2, b = 0.6, eps = 0.0001, x = 0;
            Console.WriteLine("a = {0}\neps = {1}", a, eps);
           
            double xPrev = a;
 
            var iter = 0;
            do
            {
                x = equat(xPrev);
 
                if (Math.Abs(x - xPrev) <= eps || iter == 1000)
                {
                    break;
                }
 
                xPrev = x;
                iter++;
            }
            while (true);

            Console.WriteLine("Result: {0}\nIterat: {1}", xPrev, n);
        }
            do
            {
                x = equat(x);
                c = x;
                n++;
 
            } while (Math.Abs(x - с) >= eps || n == 1000);
Ниже пример расчета методов.

Решение задачи: «Методы решения нелинейных уравнений»

textual
Листинг программы
do
            {
                x = equat(x);
                c = x;
                n++;
 
            } while (Math.Abs(x - с) >= eps || n == 1000);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5
Похожие ответы