Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Алгоритмическое конструирование




 

Функция Y (значение функции 1) Функция G (значение функции 2) Функция PG (производная от функции 2)
Y= x^5 +12x^3-6x^2+x-10

G=7^x-6x =2

G=7^x*ln(7)-6


 

       

 

Процедура Dihot (Метод дихотомии)

 


 

 

Процедура hord (Метод хорд) Процедура nut (Метод Ньютона)

 

Процедура iter (Метод простой итерации)

 

Блок-схема

 


 

Программное конструирование

 

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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...