![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Решение нелинейных уравнений методом хорд. Необходимо решить уравнение f(x)=0 с заданной точностью, если на отрезке
Постановка задачи:
Необходимо решить уравнение f(x)=0 с заданной точностью, если на отрезке
II этапа решения данной задачи:
I этап: отделение корней
Получение отрезка [a; b], содержащего единственное решение.
Проводим хорду через концы графика и находим абсциссу точки пересечения её с осью x (c1), находим значение функции в точке с1 (определяем знак функции в точке с1), сравниваем знаки функций в точке а, b, c1, присваиваем с1 в a или b (так, чтобы знаки совпадали). Проводим новую хорду, поступаем аналогично до тех пор, пока не будет выполнено одно из условий: |f(c)|< Eps или |b-a|< Eps.
II этап: численные методы (метод хорд)
Алгоритм решения:
1) Ввод a, b, Eps
2) iter do 2.1. Получение точки пересечения хорды с осью X iter++ 2.2. если b=c иначе a=c while (|f(c)|< Eps или |b-a|< Eps)
3) Вывод решения – с
4) Проверка (подставляем в функцию с, f(c) должно получиться ≈ 0)
Исходные данные:
График функции:
По графику видно, что отрезок [a; b] – это [0, 1], т. к. на этом отрезке у графика разные знаки на концах.
Текст программы:
#include< conio.h> #include< iostream.h> #include< math.h> long double f(long double x) { if (x==0) x=0.000001; return (2*log(x)-x/2+1); } void main() { clrscr(); long double a, b, Eps, c=0; int iter=0; cout< < " Vvedite a, b, Eps "; cin> > a> > b> > Eps; do { c=(f(a)*(b-a))/(f(a)-f(b))+a; if (f(a)*f(c)< 0) b=c; else a=c; iter++; } while(fabs(f(c))> Eps); cout< < " \nOtvet: " < < c< < " \n\nIteraziy: " < < iter< < " \n\nProverka: " < < f(c); getch(); }
Скриншот результата программы (при Eps=0, 001 100 итераций):
Результаты работы программы (проверка говорит о том, что решение правильное – f(c) ≈ 0):
с (
Скриншот результата программы (при Eps=0, 00000001 282 итерации):
Результаты работы программы (проверка говорит о том, что решение правильное – f(c) ≈ 0):
с (
Если сравнить результаты решения нелинейных уравнений методом деления отрезка пополам и методом хорд, то результаты почти совпадают.
Чем меньше Eps, тем больше итераций требуется для достижения результата, и тем точнее он получается.
|