Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
682.73 Кб
Скачать

Экзаменационный вопрос № 34. Программа вычисления корней алгебраического уравнения методом половинного деления

Задание. Используя подпрограмму-процедуру, составить программу для определения корней уравнения методом половинного деления.

Исходные данные.

Уравнение f(x) = 0

Метод

Интерв [а; b]

Точн. вычисл.

Ответ

Число итер-й

1

F = x

– 1,1sin x = 0,245

Половинного деления

[–5; 5]

103

1,307

14

Код программы.

Program primer1;

uses crt;

Var x: real; iter: integer; {x - значение вычисляемого корня}{iter - кол-во итераций}

Const

eps =0.001; {точность вычислений}

a:=–5.0 ; {a — левая граница отрезка }

b:=5.0; {b — правая граница отрезка}

Function Y(x:real) : real;

begin

Y:= x–1.1*sin(x)–0.245; {вычисление функции в точке}

end;

Procedure Metod_PolDel ( a, b : real; eps: real);

var с:real;

begin

repeat

c:=(a+b)/2; {Нахождение значения середины отрезка [a;b]}

if Y(a)*Y(c)<0 then

{Условный оператор, проверка на различие знаков функции на границе отрезка}

{Y(a) — вычисление искомой функции на левой границе отрезка}

{Y(b) — вычисление искомой функции на правой границе отрезка}

b:=c {Измен-е значен. правого конца, если Y(a) и Y(c) оказались разных знаков}

else {Если условие на отличие знаков функции на границе отрезка не выполн.}

a:=c; {Изменение значения левого конца, если Y(a) и Y(c) оказались с одинак. знаками}

iter:=iter+1; {Происходит увеличение числа итераций}

until b–a<=eps;

{b-a<=eps — проверка точности достижения результата}

{Если b–a оказалось <=eps, то цикл завершает свое выполнение}

{Если b–a оказалось >eps, то цикл проводит еще одну итерацию}

x:=(b+a)/2; {Получение корня функции}

end;

begin

clrscr; {clrscr — метод из модуля CRT, осуществляющий очистку экрана}

writeln(‘a=’,a:2:1);

writeln(‘b=’,b:2:1);

Metod_PolDel(a,b,eps); {вызов процедуры, вычисляющей корень уравнения}

writeln('Ответ: x=',x:5:3);

writeln(‘Кол-во итераций: i=’,iter);

write(‘Нажмите ENTER’); {Вывод сообщения на экран}

readln(); end;

Экзаменационный вопрос № 35. Программа вычисления корней алгебраического уравнения методом ньютона

Задание. Используя подпрограмму-процедуру, составить программу для определения корней уравнения методом Ньютона.

Уравнение f(x) = 0

Метод

Интерв [а; b]

Точн. вычисл.

Ответ

Число итер-й

1

F = ctg x x/8 = 0

Ньютона

[1; 5]

105

1,397 82

4

Код программы.

Program primer2;

uses crt;

Var x: real; iter: integer; {x - значение вычисляемого корня}{iter - кол-во итераций}

Const

eps =0.001; {точность вычислений}

a:=–5.0 ; {a — левая граница отрезка }

b:=5.0; {b — правая граница отрезка}

Function Y(x:real) : real;

begin

Y:= x–1.1*sin(x)–0.245; {вычисление функции в точке}

end;

Procedure Metod_PolDel ( a, b : real; eps: real);

begin

Y:= cos(x)/sin(x)–x/8;

{Вычисление значения искомой функции в заданной точке x}

end;

function Y1(x:real):real;

begin

Y1:=–1/(sin(x)*sin(x))–1/8;

{Вычисление значения первой производной искомой функции в заданной

точке x}

end;

function Y2(x:real):real;

begin

Y2:=2*cos(x)/(sin(x)*sin(x)*sin(x));

{Вычисление значения второй производной искомой функции в заданной

точке x}

end;

Procedure Metod_New ( a, b : real; eps: real);

var x0,x1 :real;

{x0 — первое приближенное значение корня функции}

{x1 — второе приближенное значение корня функции}

begin

if Y(a)*Y2(a)>0 then

{Условный оператор, проверка на отличие знаков функции и ее второй

производной}

{Y(a) — вычисление искомой функции на левой границе отрезка}

{Y2(b) — вычисление второй производной функции на левой границе отрезка}

x1:=a {Выбор начального приближения корня функции от левого конца

отрезка}

else {Если условие на отличие знаков функции и ее второй

производной не выполняется}

x1:=b; {Выбор начального приближения корня функции от правого конца отрезка}

repeat

x0:=x1;

{Изменение начального приближения корня искомой функции}

x1:=x0–Y(x0)/Y1(x0);

{Вычисление следующего приближенного решения корня функции}

iter:=iter+1; {Происходит увеличение числа итераций}

until abs(x0–x1)<=eps;

{abs(x0–x1)<=eps — проверка точности достижения результата}

{Если abs(x0–x1) оказалось <=eps, то цикл завершает свое выполнение}

{Если abs(x0–x1) оказалось >eps, то цикл проводит еще одну итерацию}

x:=x1; {Получение корня функции}

end;

begin

clrscr; {clrscr — метод из модуля CRT, осуществляющий очистку экрана}

writeln(‘a=’,a:2:1);

writeln(‘b=’,b:2:1);

Metod_New(a,b,eps);

{вызов процедуры, вычисляющей корень уравнения}

writeln('Ответ: x=',x:5:3);

writeln(‘Кол-во итераций: i=’,iter);

write(‘Нажмите ENTER’); {Вывод сообщения на экран}

readln();

end;