Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Решение нелинейных уравнений методом Ньютона
Постановка задачи:
Необходимо решить уравнение f(x)=0 с заданной точностью, если на отрезке функция f(x) непрерывна, монотонна и имеет разные знаки на концах ().
Через точку М проводим касательную к графику y=f(x), находим пересечение её с осью Х – с, строим перпендикуляр из точки с к графику, проводим новую касательную, поступаем аналогично до тех пор, пока не будет выполнено одно из условий: или .
Для реализации метода необходимо решить следующие задачи:
1) Получение (выбор) начального приближения -
2) Формула метода Ньютона:
3) Условия завершения итерационного процесса:
1. 2.
Алгоритм решения:
1) Ввод a, b, Eps
2) Выбор x0 если тогда Xk=a иначе Xk=b
3) iter++
4) Итерационный процесс:
do
4.1) iter++
4.2) 4.3) d=|XK1-XK|
4.4) если d > Eps, тогда XK=XK1
условие продолжения:
while (d > Eps)
5) Вывод результатов: XK1 и iter
6) Проверка: f(XK1) ≈ Eps
Исходные данные:
График функции:
По графику видно, что отрезок [a; b] – это [0, 1], т. к. на этом отрезке у графика разные знаки на концах.
Текст программы:
#include < conio.h> #include < math.h> #include < iostream.h> long double f(long double x) { if (x==0) x=0.000001; return (2*log(x)-x/2+1); } long double f1(long double x) { if (x==0) x=0.000001; return ((4-x)/(2*x)); } long double f2(long double x) { return ((-2)/pow(x, 2)); } void main() { clrscr(); long double a, b, Eps, c=0; int iter=0; cout< < " Vvedite a, b, Eps "; cin> > a> > b> > Eps; if(f(a)*f1(a)> 0) c=a; else c=b; do { c-=f(c)/f1(c); iter++; } while(fabs(f(c))> Eps); cout< < " \nOtvet: " < < c< < " \n\nIteraziy: " < < iter< < " \n\nProverka: " < < f(c); getch(); }
Скриншот результата программы (при Eps=0, 1 2 итерации):
Результаты работы программы (проверка говорит о том, что решение правильное – f(c) ≈ 0):
с ()=0, 724372
Скриншот результата программы (при Eps=0, 0000000001 5 итераций):
Результаты работы программы (проверка говорит о том, что решение правильное – f(c) ≈ 0):
с ()=0, 727514
Если сравнить результаты решения нелинейных уравнений методом деления отрезка пополам, методом хорд и методом Ньютона, то результаты почти совпадают.
Чем меньше Eps, тем больше итераций требуется для достижения результата, и тем точнее он получается.
|