Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прикладное программирование КР.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

Рассмотрим модифицированный метод Ньютона (метод секущих).

Пусть дано нелинейное уравнение:

f(x) = 0.

Найти корень на интервале [a,b] с точностью .

Метод модифицированного Ньютона основан на замене исходной функции f(x), на каждом шаге поиска касательной, проведенной к этой функции. Пересечение касательной с осью Х дает приближение корня (рисунок 1.1.1). В этом методе для вычисления производных на каждом шаге поиска используется численное дифференцирование по формуле:

Выберем начальную точку x0 = b (конец интервала изоляции). Находим значение функции в этой точке и проводим к ней касательную, пересечение которой с осью Х дает нам первое приближение корня x1.

Рис. 1.1.1

x1 = x0 – h0,

.

В результате итерационный процесс схождения к корню реализуется рекуррентной формулой:

.

Схема алгоритма уточнения корня методом Ньютона приведена на рисунке 1.1.2

Рис. 1.1.2 – Схема алгоритма уточнения корня методом Ньютона

1.2 Решение уравнения модифицированным методом Ньютона

Для решения задачи нахождения корня трансцендентного уравнения , где функция имеет вид , на интервале [0,1], воспользуемся встроенными функциями и средствами программирования MathCad.

Применим встроенную функцию root(f(x), x, a, b), где f(x) – исходная функция, x – переменная, которую надо найти, a и b – начало и конец отрезка, на котором находится единственное решение (данные параметры можно опустить, если задать начальное приближение для 2 параметра x). MathCad имеет поддержку средств программирования, которые мы применили для реализация рассматриваемого метода [3].

Представим выполненное задание в математическом редакторе MathCad.

Первый этап: Протабулируем функцию с точностью 0.0001

Введем интервал и шаг изменения

Табулируем функцию и определяем значение "х", при котором значение "у" находится ближе к "0"

Построим график функции (рисунок 1.2.1).

Рисунок 1.2.1 – График функции

Функция ближе всего находится к "0" при х=0.7

Второй этап: 1-способ. Используем функцию root для определения значения х с точностью до 0.0001 в интервале 0.6-0.8, при котором f(x)=0.

2-способ. Программируем, используя модифицированный метод Ньютона

Исключим отрицательное значение под корнем с помощью функции if

Функция f(x)= будет равна "0" при х=0.7014

Реализацию программы на языке программирования C#, выполняющую поиск корня уравнения модифицированным методом Ньютона можно увидеть ниже:

Первый этап – отделение корней

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace проба4

{ /*В данной программе определяем корень табулированием,*/

/*при котором функция f(x)=корень.(2Х^2+1.2-ctgX)-1 ближе всего к нулю*/

class Program

{

static double Func( double x) // Определение функции

{/*Учтем, что Ctg(x)=Cos(x)/Sin(x) или Ctg(x)=1/tg(x)*/

double y = (Math.Sqrt (2*x*x + 1.2 - Math.Cos(x)/Math.Sin(x)))- 1; // Инициализируем переменную у

return y; // Возвращаем значение

}

static void Main() // Вход в программу

{

Console.WriteLine("Протабулируем функцию - f(x)= (корень.(2x*x+1.2-ctgx))-1");

double a = 0; // начальный предел

double b = 1; // конечный предел

double h = 0.1; // шаг

for (double x = a; x <= b; x += h) // Изменяем х от 0 до 1 с шагом 0.1

{

double y = Func(x); // Вызов функции Func

if (2 * x * x + 1.2 - 1 / Math.Tan(x) <= 0) // Исключим отрицательное число под корнем

Console.WriteLine("Нет решения");

else

Console.WriteLine("y ({0:f3})=({1:f3})", x, y); // Выводим результат

}

return; // Подтверждение успешного окончания

}

}

}

Результат выполнения и работы программы изображен на рисунке 1.2.2.

Рисунок 1.2.2 – Выполнение программы

Второй этап – уточнение корня

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Ньютон

{

class Program

{

static double Func(double x) // Определение функции

{

double y = (Math.Sqrt(2 * x * x + 1.2 - 1 / Math.Tan(x))) - 1;

return y;

}

static void Main()

{

Console.WriteLine ("Уточнение корня методом модифицированного Ньютона");

double x = 0.7;

Console.WriteLine(" x={0}", x); // Ввод приближенного значения

double e = 0.0001;

Console.WriteLine(" e={0}", e); // Ввод значения точности

double b;

do

{

b = e * Func(x) / (Func(x + e) - Func(x)); // Вызов функции

x -= b;

}

while (Math.Abs(b) < e); // Условие

if (2 * x * x + 1.2 - 1 / Math.Tan(x) < 0) // Исключение деления на ноль

Console.WriteLine("Нет решения");

else

Console.WriteLine("y({0:f4}) = {1:f4}", x, Func(x)); // Ответ

return;

}

}

}

Результат выполнения и работы программы изображен на рисунке 1.2.3.

Рисунок 1.2.3 – Выполнение программы

Исходные данные объявлены локальные переменные. В методе void Main() вызовом Console.WriteLine(…) выводится информация о границах, заданной точности и функции, для которой ищется корень, на экран. Затем вызывается функция double Func(double x) осуществляющий поиск корня модифицированным методом Ньютона. Абсолютное значение можно получить с помощью метода стандартной математической библиотеки Math.Abs(…). В случае невозможности применения изучаемого численного метода пользователю выводится сообщение «Нет решения». В противном случае, происходит уточнение корня до заданной точности, по завершению данной операции выводятся результаты работы реализованного алгоритма. В процессе уточнения используется также функция double Func(double x) – возвращает значение функции в заданной точке. Для указания математических функций (тангенс, показатель степени) использовали уже знакомую математическую библиотеку Math.

Результаты реализованных программ с точными значениями, полученными в математическом редакторе MathCad, совпали с заданной точностью.