вентилятор
Хорошего настроения!

Решение уравнений методом касательных (алгоритм Ньютона) на C#



Привет! Сегодня посмотрим, как приближённо решать уравнения с помощью метода касательных (алгоритма Ньютона).


И напишем программу на языке программирования C#.


Пусть дано нелинейное уравнение: f(x) = 0 (Если уравнение будет линейное, то невозможно будет провести касательную). Метод касательных поможет приближённо найти корень уравнения на отрезке [a, b], при условии, что функция непрерывна на замкнутом интервале [a, b], и корень на этом отрезке только один! А так же функция не меняет свою вогнутость или выпуклость (постоянный знак второй производной) и не имеет экстремумов (первая производная не равна нулю) на отрезке [a, b].


Графически функция может выглядеть следующим образом:


Функция (Метод касательных)

Т.е. самая стандартная функция.





Графическая интерпретация метода Ньютона:


Графическая интерпретация метода Ньютона

От x0 узнаём значение функции. В этой точке проводим касательную. Касательная пересекает ось X, и мы получаем новую точку x1. И начинаем всё сначала. Числа x0, x1, x2 и т.д. приближаются к корню уравнения.


Выведем формулу для xn.


Уравнение касательной:
y = f(x0) + f′(x0)(x-x0)

Приравняем к нулю (пересечение с осью X) и выразим x.


x1=x0 - f(x0) / f′(x0)
xn+1=xn - f(xn) / f′(xn)

Погрешность данного метода ε > |xn+1 - xn|. Причём самая первая точка x0 не берётся во внимание при определении погрешности. Т.е. если |xn+1 - xn| меньше, чем заданное значение ε, то можно прекращать вычисления.


За саму первую точку x0 берут либо начало отрезка a, либо конец отрезка b. Это зависит от возрастания или убывания функции, а так же, в какую сторону выпукла функция.


Удобно пользоваться правилом:


  • x0 = a, если f(a)*f′′(x)>0
  • x0 = b, если f(b)*f′′(x)>0

Для примера, найдём положительный корень уравнения: x2 = 2





Определим отрезок [1, 2], где будем искать корень.


Функция f(x) = x2 - 2

f′′(x) = 2
f(2) = 4 - 2 = 2

Значит, x0 = 2, т.к. f′′(x) * f(2) > 0.

Определим корень уравнения с точностью до ε=0.001 на языке программирования C#.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace ConsoleApp64
{
    class Program
    {
        static void Main(string[] args)
        {
            double x0, xn, xnp1, e;
          
            e = 0.001;
            x0 = 2;
            xn = x0 - (Math.Pow(x0, 2)-2)/(2*x0) ;
            xnp1 = xn - (Math.Pow(xn, 2)-2)/(2*xn);


            while (xn - xnp1 >= e)
            {
                xn = xnp1;
                xnp1 = xn - (Math.Pow(xn, 2)-2) / (2 * xn);
 
            }

            Console.WriteLine("{0:0.000}", xnp1);
        }
    }
}

Т.к. x0 - не участвует при вычислении погрешности, то мы в начале до цикла while вычисляем xn и xn+1 (xnp1). Т.к. тип данных double, то чтобы возвести число в степень, используем специальную функцию Math.Pow(). В условии цикла while мы используем разницу без модуля, потому что мы идём от правого конца отрезка, и xn всегда больше, чем xnp1.


Метод Ньютона - программа на Си шарп





02-06-2021 в 07:08:04





Поддержать сайт:


Похожая статья:

Сортировка слиянием (merge sort) на C#

Привет! Сегодня рассмотрим крутой метод сортировки слиянием....

Категория: Алгоритмы  Подкатегория: Сортировка
Дата: 23-10-2022 в 13:42:22 0


Комментарии:

Здравствуйте. Помогите реализовать блок-схему, содержится по ссылке:
Светлана 23-10-2021 в 16:42:24

Здравствуйте. Помогите реализовать блок-схему, содержится по ссылке: https://www.mathros.net.ua/rozvjazok-systemy-linijnyh-algebraichnyh-rivnjan-metodom-kramera.html
Светлана 23-10-2021 в 16:43:24

Здравствуйте! Сейчас нет возможности.
Калужский Александр 23-10-2021 в 17:09:19

Понятно. Извените за беспокойствие.
Светлана 23-10-2021 в 19:03:07



Оставить коментарий:



Напишите email, чтобы получать сообщения о новых комментариях (необязательно):


Задача против робота. Расположите картинки горизонтально:




Нажимая кнопку Отправить, Вы соглашаетесь с политикой конфиденциальности сайта.