Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Численные методы.Пособие - окончательный вариан...doc
Скачиваний:
5
Добавлен:
01.05.2025
Размер:
5.41 Mб
Скачать

3. Контрольные вопросы. Метод Эйлера

  1. Что является решением дифференциального уравнения (далее – Д. У.)?

  1. Что называется задачей Коши для Д. У. 1-го порядка?

  1. В чем состоят условия существования и единственности решения задачи Коши для Д. У. 1 – го порядка?

  1. Как оценивается погрешность численного метода решения задачи Коши? Что называется порядком (порядком точности) численного метода?

  1. Изложите вычислительный алгоритм метода Эйлера. Необходим ли поиск начальных условий в методе Эйлера?

  1. Какова геометрическая интерпретация метода Эйлера?

  1. Почему метод Эйлера имеет первый порядок точности, модифицированный метод Эйлера – второй порядок?

  1. Обязательно ли задание начальных условий при решении Д. У. методом Эйлера?

  1. В чем заключается отличие явных и неявных вычислительных схем в модифицированном методе Эйлера?

  1. В чем заключается правило Рунге оценки погрешности решения задачи Коши численным методом? Запишите правило Рунге для метода Эйлера и модифицированного метода Эйлера.

Методы Рунге – Кутта

  1. В каком случае численный метод называется методом Рунге – Кутта порядка ?

  1. Почему метод Эйлера можно называть методом Рунге – Кутта 1 – го порядка?

  1. Как записывается вычислительный алгоритм метода Эйлера – Коши?

  1. Как записывается вычислительный алгоритм метода Рунге – Кутта 4 – го порядка?

  1. Сколько раз необходимо на каждом шаге вычислять правую часть уравнения при использовании метода Рунге – Кутта 4-го порядка?

  1. Как можно оценить погрешность решения Д. У. при использовании классического метода Рунге – Кутта?

  1. Какова геометрическая интерпретация численного решения задачи Коши? В чем заключается геометрический смысл увеличения порядка точности численного метода?

ПРИЛОЖЕНИЕ 1 Общие указания к выполнению лабораторных работ.

  • Результаты выполнения лабораторной работы оформляются в виде отчета, на листах формата А4.

  • Отчет имеет следующую структуру:

  1. Титульный лист — образец оформления титульного листа - см. в приложении 2;

  2. Содержание — включает следующие пункты:

  1. Цель работы;

  2. Постановка задачи и методы решения;

  3. Выполнение работы (основная часть отчета, содержащая результаты вычислений, оформленные в соответствии с заданием);

  4. Вывод.

  1. Приложение — содержит текст (листинг) используемой в расчетах программы (либо соответствующий документ математических пакетов Mathcad, Mathlab – если это предусмотрено).

  2. CD с используемой в расчетах программой - если это предусмотрено.

ПРИЛОЖЕНИЕ 2 Образец оформления титульного листа отчета по лабораторной работе

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования

«Калининградский государственный технический

университет»

Факультет фундаментальной подготовки

Кафедра высшей математики

Дисциплина «Численные методы»

ОТЧЕТ

по лабораторной работе №___

« »

Вариант №____

Выполнил

студент

группа___________________

Проверил

Калининград 20__

ПРИЛОЖЕНИЕ 3

Некоторые программы на языках программирования QBasic и Pascal.

Программа №1: отделение корней уравнения (на языке QBasic)

10 REM ОТДЕЛЕНИЕ КОРНЕЙ

20 DEF FN F(X) =COS(X)-.1*X

30 INPUT A, B, H: K=0

40 X1=A: X2=X1+H: Y1=FNF(X1)

50 IF X2>B THEN 120

60 Y2=FNF (X2)

70 IF Y1*Y2>0 THEN 100

80 K=K+1

90 PRINT K; “-Й КОРЕНЬ” ; “[“; X1; ” ;” X2;”]”

100 X1=X2; X2=X1+H: Y1=Y2

110 GOTO 50

120 END

Программа №2.1: метод бисекции (на языке QBasic).

10 REM МЕТОД БИСЕКЦИИ

20 DEF FN F(X)=SIN(2X)- LOG(X)

30 INPUT A, B, E

40 C=(A+B)/2

50 IF FNF(A)*FNF(C)<0 THEN 70

60 A=C: GOTO 80

70 B=C

80 IF B-A>E THEN 40

90 X=(A+B)/2: D=(B-A)/2

100 PRINT “X=”; X,”D=”;D

110 END

Программа №2.2: метод бисекции (на языке Pascal).

Program Solve_equation_Div;

Uses Crt;

Var

a,b,d,e,x1,fa,f1 :real;

ch :char;

{*********************ПОДПРОГРАММЫ***************************}

{____________________Пауза______________________________________}

Procedure Pausa;

Begin

Writeln;

Writeln(Для продолжения нажмите любую клавишу…);

Repeat

ch:= readkey;

Until ch<>;

End;

{___________________Функция f(x) из уравнения f(x)=0_____________}

Function f(x:real):real;

Begin

f:=sin(2*x)-ln(x);

End;

{____________________Вывод результата на экран__________________}

Procedure Result_Output;

Begin

ClrScr;

Writeln(‘ x = ’,x1:16:8);

Writeln(‘Погрешность результата = ’, d:16:12);

Writeln;

Pausa;

End;

{____________ОСНОВНАЯ ПРОГРАММА________________________}

BEGIN

ClrScr;

Writeln(‘Введите координаты концов отрезка a,b и точность epsilon’);

Readln(a,b,e);

If ((f(a)*f(b))>0) then

Begin

Writeln(‘Уравнение не имеет решений’);

Halt;

End;

Repeat

x1:=(a+b)/2; f1:= f(x1);

If ((abs(f1)<0,0000000000001) then

Begin

d:=0.0;

Result_Output;

Halt;

End;

fa:= f(a);

If ((fa*f1)<0) then b:=x1 else a:=x1;

d:= b-a;

Result_Output;

Until (d<e);

END.

Программа №3.1: решение системы линейных уравнений методом итераций (на языке QBasic).

10 REM МЕТОД ИТЕРАЦИЙ

20 INPUT X,Y,Z,A,E

30 B=E*(1-A)/A

40 X1=-.64925*Y-.03358*Z-.80100

50 Y1=.51311*X-.26557*Z-5.73525

60 Z1=.20155*X-.36262*Y-1.24117

70 P=SQR(X1-X)^2+(Y1-Y)^2+(Z1-Z)^2)

80 X=X1:Y=Y1;Z=Z1

90 IF P<=B THEN PRINT “X=”;X; PRINT “Y=”;Y:PRINT

“Z=”;Z ELSE 40

100 END

Программа №3.2: решение системы линейных уравнений методом итераций (на языке Pascal).

Program Solve_system_Iteration;

Uses Crt;

Const L= 9;

Type

Matrix_A=array[1..L,1..L+1] of real;

Vector_x = array[1..L] of real;

Var

i,j, n :integer;

d,d1,d2,e,s :real;

a :Matrix_A;

x,x1 :Vector_x;

ch :char;

{*********************ПОДПРОГРАММЫ***************************}

{____________________Пауза______________________________________}

Procedure Pausa;

Begin

Writeln;

Writeln(Для продолжения нажмите любую клавишу…);

Repeat

ch:= readkey;

Until ch<>;

End;

{____________________Вывод матрицы на экран________________________}

Procedure Matrix_Output;

Begin

ClrScr;

For i:=1 to n do

Begin

For j:=1 to (n+1) do

Write(a[i,j]:16:8);

Writeln;

End;

Pausa;

End;

{_______Вычисление вектора неизвестных на каждом шаге итераций________}

Procedure Step_Of_Iteration;

Begin

For i:=1 to n do

Begin

x1[i]:=a[i,n+1];

For j:=1 to n do

If (j<>i) then x1[i]:= x1[i]+ a[i,j]*x[j];

End;

End;

{__________Вычисление нормы вектора неизвестных_____________________}

Function norm_x(x: Vector_x):real;

Var

y: real;

Begin

y:= abs(x[1]);

for i:= 1 to n do

if (abs(x[i])>y) then y:=abs(x[i]);

norm_x:=y;

End;

{________Вывод на экран вектора неизвестных_________________________}

Procedure Vector_x_Output;

Begin

ClrScr;

For i:=1 to n do Writeln(‘ x ‘,i,’ = ‘,x1[i]:16:8);

Writeln(‘Расстояние между итерациями по норме = ’d:10:8);

End;

{________Замена вектора неизвестных x на вычисленный вектор x1 _______}

Procedure X_X1;

Begin

For i:=1 to n do x[i]:=x1[i];

End;

{*******************ОСНОВНАЯ ПРОГРАММА***********************}

BEGIN

ClrScr;

Writeln(Введите число уравнений n и точность вычислений epsilon );

Read(n,e);

Writeln(Введите расширенную матрицу системы построчно);

For i:= 1 to n do

Begin

For j:=1 to (n+1) do

Read(a[i],y[i]);

Writeln;

End;

Matrix_Output;

{________Проверка условия: диагональные элементы отличны от нуля____}

For i:= 1 to n do

Begin

If (abs(a[i,j])<0.000000001) then

Begin

Writeln;

Writeln(‘Система уравнений не решается методом итераций’);

Pausa;

Goto finish;

End;

End;

{______Приведение матрицы к виду, удобному для итераций; вычисление

компонент вектора x1; вычисление норм приведенной матрицы__}

d2:=0;

For i:=1 to n do

Begin

s:= a[i,i]; a[i,i]:=0; x1[i]:=0;

a[i,n+1]:= a[i,n+1]/s ; x[i]:=a[i,n+1];

For j:=1 to n do

If (j<>i) then

Begin

a[i,j]:=-a[i,j]/s;

x1[i]:= x1[i]+abs(a[i,j]);

End;

End;

d2:= sqrt(d2);

Matrix_Output;

d:=norm_x(x1);

For i:=1 to n do

Begin

x1[i]:=0;

For j:=1 to n do

If (j<>i) then x1[i]:= x1[i]+abs(a[j,i]);

End;

d1:=norm_x(x1);

Writeln;

Writeln(‘Нормы = ‘, d:8:4,’ ; ‘,d1:8:4,’ ; ‘,d2:8:4);

{______________Нахождение наименьшей из трех норм______________}

If (d1<d) then d:=d1;

If (d2<d) then d:=d2;

Writeln(‘ Наименьшая норма = ’, d:8:4);

If (d>=1) then

Begin

Writeln(‘’);

Writeln(‘’);

Pausa;

Halt;

End;

Writeln(‘’);

Pausa;

s:=d/(1-d);

Repeat

Step_Of_Iteration;

For i:=1 to n do

x[i]:=x1[i] – x[i];

d:=norm_x(x);

Vector_x_Output; Pausa;

X_X1;

Until ((d*s)<e);

END.

Программа №4.1: построение многочлена Лагранжа (на языке QBasic).

10 REM МНОГОЧЛЕН ЛАГРАНЖА

20 DIM X(30), Y(30)

30 INPUT «ВВЕДИТЕ ПОРЯДОК МНОГОЧЛЕНА ЛАГРАНЖА»;N

40 PRINT «ВВЕДИТЕ ПАРАМИ ЗНАЧЕНИЯ X И Y»

50 FOR I=0 TO N

60 INPUT X(I),Y(I)

70 NEXT I

80 INPUT «ВВЕДИТЕ ЗАДАННОЕ ЗНАЧЕНИЕ

АРГУМЕНТА»; A:F=0

90 FOR I=0 TO N

100 L=1

110 FOR J=0 TO N

120 IF I=J THEN 140

130 L=L*(A-X(J))/(X(I)-X(J))

140 NEXT J

150 L=L*Y(I):F=F+L

160 NEXT I

170 PRINT «ПРИ X=»;A, «F(»;A;«)=»; F

180 INPUT «ЕСЛИ ХОТИТЕ ПРОДОЛЖИТЬ ВЫЧИСЛЕНИЯ-

ВВЕДИТЕ 1, ЕСЛИ –НЕТ – 0»;M

190 IF M=1 THEN 80

200 END

Программа №4.2: построение многочлена Лагранжа (на языке Pascal).

Program Polinom_Lagrange;

{***************************************************************}

{***Вычисление значения многочлена Лагранжа n-го порядка

для функции, определенной в (n+1) узлах интерполяции***}

Uses Crt;

Const m = 30;

Type

Vector_x = array[0..m] of real;

Var

i,j, n :integer;

p,L,x1 :real;

x, y :vector_x;

ch :char;

{*********************ПОДПРОГРАММA***************************}

{____________________Пауза______________________________________}

Procedure Pausa;

Begin

Writeln;

Writeln(Для продолжения нажмите любую клавишу…);

Repeat

ch:= readkey;

Until ch<>;

End;

{*******************ОСНОВНАЯ ПРОГРАММА***********************}

BEGIN

ClrScr;

Writeln(Введите n - порядок многочлена Лагранжа);

Read(n);

Writeln(Введите пары значений x[i], y[i] (i=0,1,2…n) :);

For i:= 0 to n do

Begin

Read(x[i],y[i]);

Writeln;

End;

Writeln(‘Введите x, в котором вычисляется значение мн-на Лагранжа:’);

Read(x1);

L:=0;

For i:= 0 to n do

Begin

p:=1:

For j:=0 to n do

If (j<>i) then p:=p*(x1 – x[j])/(x[i]-x[j]);

L:=L+p*y[i];

End;

Writeln( ‘ x = ’,x1:10:4, ‘ L(x) = ’, L:10:4);

Pausa;

END.

Программа №5: вычисление производной с помощью многочлена Ньютона (на языке QBasic).

Rem вычисление производной полиномом Ньютона

INPUT “ введите значение x в начальной (нулевой) точке”;X0

INPUT “введите шаг таблицы h=”;h

INPUT “введите номер последней точки n=”;n

DIM y(30)

FOR i=0 TO n

INPUT “y(i)=”;y(i)

NEXT i

INPUT “ введите значении аргумента arg=”;arg

REM дифференцирование произведений вида (t-k)

DEF fndifpol (t,n)

d=0

FOR s=0 TO n

IF s=t THEN GOTO 1

d=d+1/(t-s)

NEXT s

pol=1

FOR s=0 TO n

pol=pol*(t-s)

NEXT s

GOTO 3

1 c=1

FOR k=0 TO n

IF k=t THEN GOTO 2

c=c*(t-k)

2 NEXT k

fndifpol=c

GOTO 4

3 fndifpol=pol*d

4 END DEF

REM вычисление производной полинома

DEF fndifnew (x,h,y,n,arg)

REM преобразование массива значений функции в

массив конечных разностей

FOR i=0 TO n-1

a=y(i)

FOR k=i TO n-1

b=y(k+1)-y(k)

y(k)=a

a=b

NEXT k

y(n)=b

NEXT i

REM деление конечных разностей на значение факториала

f=1

FOR i=2 TO n

f=f*i

y(i)=y(i)/f

NEXT i

t=(arg-x0)/h

REM вычисление значения производной

dif=y(1)

FOR i=1 TO n-1

dif=dif+fndifpol(t,i)*y(i+1)

NEXT i

fndifnew=dif/h

END DEF

pr=fndifnew(x0,h,y,n,arg)

PRINT “df/dx=”;pr,” при x=”;arg

END

Программа №6: вычисление определенного интеграла по квадратурным формулам прямоугольников, трапеций и Симпсона (на языке Pascal).

Program Integration;

Uses Crt;

Var

i, n :integer;

a,b,h :real;

s1, s2, s3, x, x1, x2 :real;

ch :char;

{*********************ПОДПРОГРАММЫ***************************}

{____________________Подынтегральная функция_____________________}

Function f (x:real):real;

Begin

f:= exp(x*x);

End;

{____________________Пауза______________________________________}

Procedure Pausa;

Begin

Writeln;

Writeln(Для продолжения нажмите любую клавишу…);

Repeat

ch:= readkey;

Until ch<>;

End;

{*******************ОСНОВНАЯ ПРОГРАММА***********************}

BEGIN

ClrScr;

Writeln(Введите значения концов отрезка [a, b] );

Read(a,b);

Writeln(Введите число разбиений отрезка n );

Read(n);

h:= (b-a)/n ; x1:= a+h/2; x2:= a;

s1:= f(x1); s2:= ((f(x2)+f(b))/2;

for i:= 1 to n-1 do

begin

x1:= x1+h; x2:= x2 + h;

s1:= s1+f(x1); s2:= s2+f(x2);

end;

s1:= h*s1; s2:= h*s2; s3:= (2*s1+s2)/3;

Writeln (Значение интеграла по формуле прямоугольников = , s1: 9 :6);

Writeln (Значение интеграла по формуле трапеций = , s2: 9 :6);

Writeln (Значение интеграла по формуле Симпсона = , s3: 9 :6);

Pausa;

END.

Программа №7. Программа вычисления определенного интеграла с заданной точностью epsilon методом двойного пересчета по квадратурной формуле Симпсона (на языке Pascal).

Program Integr_Sympson;

Uses Crt;

Var

i, n :integer;

a,b,h :real;

s, s1, s2, x, x1, x2 :real;

f0, f1, d, eps :real;

ch :char;

{*********************ПОДПРОГРАММЫ***************************}

{____________________Подынтегральная функция_____________________}

Function f (x:real):real;

Begin

f:= exp(x*x);

End;

{____________________Пауза______________________________________}

Procedure Pausa;

Begin

Writeln;

Writeln(Для продолжения нажмите любую клавишу…);

Repeat

ch:= readkey;

Until ch<>;

End;

{*******************ОСНОВНАЯ ПРОГРАММА*********************}

BEGIN

ClrScr;

Writeln(Введите значения концов отрезка [a, b] );

Read(a,b);

Writeln(Введите точность вычислений epsilon );

Read(eps);

f0:= f(a); f1:= f(b); s:= f0 – f1;

s1:= (b – a)*( f0 + f1 + 4*f(( a + b )/2 ) ) / 6;

n:= 2;

REPEAT

h:= ( b – a ) /n ; x1:= a + h/2 ; x2:= a + h ; s2:= s ;

for i:= 1 to n do

begin

s2:= s2 + 4*f(x1) + 2*f(x2);

x1:= x1+h; x2:= x2 + h;

end;

s2:= s2*h/6; d:= abs( s1 – s2 )/15;

s1:= s2; n:= 2*n;

UNTIL (d < eps);

Writeln (Значение интеграла = , s2: 9 :6);

Writeln (Погрешность = , d: 9 :6);

Pausa;

END.

Программа №8. Программа вычисления определенного интеграла с заданной точностью epsilon методом двойного пересчета по квадратурной формуле Гаусса с тремя узлами (на языке Pascal).

Program Integr_Sympson;

Uses Crt;

Var

i, n :integer;

a, b, h, h1, c, c1 :real;

s, s1, s2, x1, x2, x3 :real;

f0, f1, d, eps :real;

ch :char;

{*********************ПОДПРОГРАММЫ***************************}

{____________________Подынтегральная функция_____________________}

Function f (x:real):real;

Begin

f:= exp(x*x);

End;

{____________________Пауза______________________________________}

Procedure Pausa;

Begin

Writeln;

Writeln(Для продолжения нажмите любую клавишу…);

Repeat

ch:= readkey;

Until ch<>;

End;

{*******************ОСНОВНАЯ ПРОГРАММА***********************}

BEGIN

ClrScr;

Writeln(Введите значения концов отрезка [a, b] );

Read(a,b);

Writeln(Введите точность вычислений epsilon );

Read(eps);

c:= sqrt ( 3 / 5 ); h1 := ( b – a ) / 2 ; c1 := c*h1;

x2 := ( b + a ) / 2 ; f1 := f( x2 – c1 ) ; f3 := f( x2 + c1 );

s1 := h1*( 5* f1 + 8*f( x2 ) + 5*f3 ) / 9;

n := 2;

REPEAT

h := ( b – a ) /n ; h1 := h / 2 ; c1 := c * h1 ;

x2 := a + h1 ; x1:= x2 – c1 ; x3 := x2 + c1 ; s2 := 0 ;

for i:= 1 to n do

begin

s2:= s2 + 5*f(x1) + 8*f(x2) + 5*f(x3);

x1:= x1 + h; x2:= x2 + h; x3 := x3 + h ;

end;

s2 := s2*h1 / 9; d := abs( s1 – s2 )/63;

s1 := s2; n := 2*n;

UNTIL (d < eps);

Writeln (Значение интеграла = , s2: 9 :6);

Writeln (Погрешность = , d: 9 :6);

Pausa;

END.

Программа №9: Численное решение задачи Коши для дифференциального уравнения 1-го порядка методами Эйлера, Эйлера – Коши и Рунге – Кутта (на языке Pascal).

Program Dif_equations_solver;

{*****************РЕШЕНИЕ ЗАДАЧИ КОШИ***********************}

{***ДЛЯ ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ 1-ГО ПОРЯДКА ***}

Uses CRT;

Const c: array[1..4] of real = (0,0.5,0.5,0);

Type

Koefts = array[0..4] of real;

Var

i, j, n : longint;

a, b, d, h, x, y, y1, y2, y3 : real;

k0, k : Koefts;

ch : char;

{********************ПОДПРОГРАММЫ***************************}

{ _________ Правая часть уравнения – функция _____________ }

Function f(x, y :real): real;

Begin

f:= x+y;

End;

{___________Пауза________________________________________________}

Procedure Pausa;

Begin

Writeln;

Writeln(‘ Для продолжения нажмите любую клавишу…..’);

Repeat

ch:= readkey;

Until ch<>’’;

End;

{*******************ОСНОВНАЯ ПРОГРАММА********************}

BEGIN

Clrscr;

Write (‘ Введите значения концов отрезка [a,b] : ’);

Readln(a,b); d:=b-a;

Write(‘ Введите начальное значение y0 функции при x=x0 : ‘);

Readln(y);

Repeat

Writeln(‘ Введите шаг интегрирования h>0, h< ’, d:5:2,’ : ‘);

Readln(h);

Until ((h>0) and (h<d));

x:= a; n:= round((b-a)/h); y1:= y; y2:= y; y3:= y;

Writeln(‘******* Метод Эйлера **Метод Эйлера – Коши **Метод Рунге – Кутта’);

Writeln(‘ x= ‘,x:6:2, ‘ y1 = ‘, y1:12:6, ‘ y2 = ‘, y2:12:6; ‘ y3 = ‘,y3:12:6);

For i:=1 to n do

Begin

{****Метод Эйлера****}

y1:=y1+h*f(x,y1);

{****Метод Эйлера – Коши **** }

k0[0]:=0.0;

for j:=1 to 2 do k0[j]:=h*f(x+2*c[j]*h, y2+2*c[j]*k0[j-1]);

y2:=y2 + (k0[1]+k0[2])/2 ;

{****Метод Рунге – Кутта*****}

k[0]:=0.0;

for j:=1 to 4 do k[j]:=h*f(x+c[j]*h, y3+2*c[j]*k[j-1]);

y3:=y3 + (k[1]+2*k[2]+2*k[3]+k[4])/6 ;

x:=x+h;

Writeln(‘ x= ‘,x:6:2, ‘ y1 = ‘, y1:12:6, ‘ y2 = ‘, y2:12:6; ‘ y3 = ‘,y3:12:6);

End;

Pausa;

END.

ПРИЛОЖЕНИЕ 4 Примеры выполнения расчетов в вычислительном пакете Mathcad.

Пример №1.

Лабораторная работа № 3 «Интерполяция и аппроксимация функций»

Задание

Функция задана таблицей:

Таблица 1

x

0,5

2,5

4,5

6,5

8,5

10,5

12,5

14,5

f(x)

3,0

8,3

15,6

28,0

39,0

51,2

78,4

116,0

Определить, каким аналитическим выражением можно представить указанную функцию на отрезке и вычислить значения функции в заданных точках x1 = 1,3 и x2=7,8.