Алгоритмическое конструирование
⇐ ПредыдущаяСтр 3 из 3
Программное конструирование
Const p = 0.001;{Задаем погрешность.}
function F(x: real): real;{Первое уравнение.} Begin Result:= exp(5 * ln(x)) + 12 * exp(3 * ln(x)) - 6 * sqr(x) + x - 10; end;
function G(x: real): real;{Второе уравнение.} Begin Result:= exp(x * ln(7)) - 6 * x - 2; end;
function dG(x: real): real;{Производная от второго уравнения.} Begin Result:= power(7, x) * ln(7) - 6; end;
Var a, b, c, x, a1, b1, y1, y2, xp, k, max: real; it,v1,v2: integer;
procedure Dih; Begin Writeln('Уравнение: x^5+12x^3+6x^2+x+10=0'); Writeln('Введите левую границу отрезка: '); readln(a); Writeln('Введите правую границу отрезка: '); readln(b); a1:= a;b1:= b; it:=0; {переменная для счетчика итераций.} if F(a) * F(b) < 0 then begin Repeat c:= (a + b) / 2; {деление отрезка пополам} if F(a) * F(c) < 0 then b:= c {Получаем новую границу} else a:= c; inc(it); {Подсчет количества итераций} until abs(b - a) <= p; writeln('Метод дихотомии: x= ', c:2:3, ' Кол-во итераций: ', it); End else writeln('На введенном интервале ф-я одного знака.') end;
procedure Hord; Begin Writeln('Введите левую границу отрезка: '); readln(a1); Writeln('Введите правую границу отрезка: '); readln(b1); it:= 0; {Обнуляем переменную счетчика итераций} Repeat x:= a1 - F(a1) * (b1 - a1) / (F(b1) - F(a1)); if F(a1) * F(x) <= 0 then b1:= x {Получаем новую правую либо левую границу} else a1:= x; inc(it); until abs(F(x)) <= p; Writeln('Метод хорд: x= ', x:2:3, ' Кол-во итераций: ', it); end;
procedure Kasat; Begin Writeln('Уравнение: 7^x-6x=2'); Writeln('Введите значение левого отрезка: ');
readln(a); Writeln('Введите значение правого отрезка: '); readln(b); a1:= a;b1:= b; it:= 0; c:= abs(a - b); x:= b; while abs(c) > p do Begin x:= x - G(x) / dG(x); c:= abs(x - b); b:= x; inc(it) end; Writeln('Метод Ньютона: x=', x:2:3, 'Кол-во итераций: ', it) end;
procedure Iter; Begin a1:=0; b1:=0; Writeln('Введите значение левого отрезка: '); readln(a1); Writeln('Введите значение правого отрезка: '); readln(b1); it:= 0; if g(a1) * g(b1) < 0 then {Проверка сходимости.} Begin y1:=dG(a1); y2:=dG(b1); if y1>y2 then max:=y1 else max:=y2; {Находим максимум производной.} x:=(a1+b1)/2; {Вычисление первого приближения.} inc(it); Repeat xp:=x-(G(x)/max); {Вычисление приближения.} k:=xp-x; {Вычисление разности приближений.} x:=xp; inc(it); until abs(k)<=p; Writeln('Метод простых итераций: x=', x:2:3, 'Кол-во итераций: ', it);
End Else writeln('На данном промежутке корней нет.'); end;
Begin Begin writeln('Что вы хотите решить:'); write('1. x^5 +12*x^3-6*x^2+x-10=0 или 2. 7^x-6*x =2? '); read(v1); writeln; if v1 = 1 then begin {Условие выбора первой функции} writeln('Каким методом вы хотите это решить:'); write('1. Методом дихотомии или 2. Методом хорд? '); read(v2); writeln; if v2 = 1 then dih {Условие выбора метода дихотомии} else if v2 = 2 then hord end; {Условие выбоа метода хорд} if v1 = 2 then begin {Условие выбоа второй функции} writeln('Каким методом вы хотите это решить:'); write('1. Методом Ньютона или 2. Методом простой итерации? '); read(v2); writeln; if v2 = 1 then kasat {Условие выбора метода Ньютона} else if v2 = 2 then iter{Условие выбора метода простой итерации} end; end; end. Результаты расчётов, выводы Задание 1,2:
Вывод: Для функции x5 +12x3-6x2+x-10=0 наиболее эффективен метод хорд, так как он имеет меньшее количество итераций по сравнению с методом дихотомии. Для функции 7x-6x =2 наиболее эффективен метод Ньютона, так как он имеет меньшее количество итераций по сравнению с методом простых итераций. Данная работа помогает научиться программировать методы решения нелинейных уравнений в среде PascalABC.NET.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|