Валерий Альмухаметов Вычислительная математика



Методы вычислительной математики делятся на точные и приближенные. Точные методы применяются в тех случаях, когда известны расчетные формулы, а также конкретное значение коэффициентов в них.

Существуют ситуации, когда расчетная формула неизвестна, или слишком сложна; величины, которые используются в вычислениях, заданы неявно; коэффициенты, содержащиеся в уравнениях, известны лишь приблизительно. Поэтому важное значение приобретают способы приближенного нахождения решения и оценки степени их точности.

Предлагаются к изучению простейшие численные модели, решение систем линейных уравнений, численное интегрирование и дифференцирование, методы решения задачи Коши для обыкновенных дифференциальных уравнений, методы конечных разностей решения уравнений в частных производных.

Методы вычислительной математики применяются также для поиска экстремального значения целевой функции в оптимизационных задачах, в том числе в нелинейных.

При обработке результатов эксперимента часто возникает задача построения эмпирической формулы, дающей аналитическое выражение функциональной зависимости, заданной таблицей. Для этого пользуются аппроксимацией функций по способу наименьших квадратов.

При использовании численных методов необходимо помнить о физической сущности рассматриваемых математических задач.

Некоторые задачи вычислительной математики можно решить, используя возможности табличного процессора Excel. Практически все задачи вычислительной математики можно решить в среде программного продукта Mathcad.

©Альмухаметов В.

НАХОЖДЕНИЕ ПОЛИНОМА ПО СХЕМЕ ГОРНЕРА

Для вычисления полинома n-й степени можно использовать схему Горнера: Y=((…((an*x +an-1)*x + an-2)*x +… +a2)*x + a1)*x + a0

рекуррентная формула при этом выражается в виде:

i = n Yi = аn Yi – 1= Yi x + ai

Алгоритм метода

Пример программы на языке Pascal

VAR N,I:INTEGER;X,Y:REAL;A:ARRAY[0..10] OF REAL;

BEGIN

WRITE('Введите N=');READLN(N);

WRITE('Введите X=');READLN(X);

WRITELN('Введите коэффициенты:');

FOR I:=0 TO N DO BEGIN

WRITE('A[',I,']=');READLN(A[I]);END;

Y:=A[N];

FOR I:=N-1 DOWNTO 0 DO Y:=Y*X+A[I];

WRITELN('Результат Y=',Y); END.

ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННЫХ ИНТЕГРАЛОВ

Задача численного интегрирования состоит в нахождении приближенного значения интеграла. Отрезок (ab) разбивается на определенное число интервалов N, в зависимости от требуемой точности вычисления.

Формула ПРЯМОУГОЛЬНИКА

шаг: h=(b-a)/N

Геометрическая интерпретация метода:

Формула ТРАПЕЦИИ

шаг: h=(b-a)/N О – показатель точности вычислений

Геометрическая интерпретация метода:

Алгоритм метода трапеций:

Решить задачу:

Методом трапеций найти значение интеграла функции Y = x – Cos(x) в пределах от 0 до 2.

Пример программы (Pascal):

PROGRAM P10;

FUNCTION FUN(X:REAL):REAL;

BEGIN

FUN:=X-COS(X); END;

VAR H,X,Y,A,B:REAL; I,N:INTEGER;

BEGIN

WRITELN('Ввести данные A(0),B(2),N(1000) = ');

READ(A,B,N);

X:=0; Y:=0; H:=(B-A)/N;

FOR I:=1 TO N-1 DO BEGIN

X:=X+H;Y:=Y+FUN(X);END;

Y:=H/2*(FUN(A)+FUN(B)+2*Y);WRITELN('Результат= ',Y);

END.

(Результат для 1000 шагов: 1.09070287627348)


Решить задачу:

Задача. Найдите значение определенного интеграла от функции на интервале [1; 4], количество разбиений n = 52.

Пример программы на языке Pascal

CONST N = 52; A = 1; B = 4;

VAR Y0, YN, X, S, H: REAL;I: INTEGER;

BEGIN

H := (B-A)/N; Y0 := SQR(LN(A))/A;

YN := SQR(LN(B))/B; S := (Y0 + YN)/2;

FOR I:= 1 TO N-1 DO

BEGIN

X := A + I*H;

S := S + SQR(LN(X))/X

END; S := S*H;

WRITELN (‘ИНТЕГРАЛ РАВЕН ’, S);

END.

Подпрограмма на языке Basic

10 DEF FNA(X)=EXP(-Х*Х)

20 PRINT "N,B0,B9,H1"; : INPUT N,B0,B9,H1

30 C=2/SQR(PI) : A=0 : S1=0

40 FOR B=B0 TO B9 SТЕР H1

50 GOSUB 100

60 S1=S1+S : A=B

70 PRINT B,C*S1 : NEXT В

90 GOTO 10

100 H=(B-A)/N : S1=(FNA(A)+FNA(B))/2

110 FOR I = 1 TO N-1 : S=S+FNA(A+ I *H) : NEXT I

120 S=S*H

190 RETURN


110 REM МЕТОД ТРАПЕЦИИ

120 INPUT . “Входные переменные A,B,N =”;A,B,N

130 H = (B-A)/N

140 S = O

150 X = A

160 FOR I = 1 TO N-1

170 X = X+H

180 S = S + FNY (X)

190 NEXT I

200 S = H*(FNY(A) + FNY(B) + 2*S) / 2

210 RETURN

Подпрограмма на языке Pascal

VAR N,I,K:INTEGER; A,B,B0,B9,H,C,S,S1:REAL;

FUNCTION F(X:REAL):REAL;BEGIN

F:=EXP(-X*X);END;

PROCEDURE TRAP(VAR A,B:REAL;

N:INTEGER; FUNCTION F:REAL;S:REAL);

VAR I:INTEGER;H:REAL;

BEGIN H:=(B-A)/N;S:=(F(A)+F(B))/2;

FOR I:=1 TO N-1 DO S:=S+F(A+I*H);

S:=S*H;END;

BEGIN C:=2/SQRT(3.14159265);

REPEAT WRITE('N,B0,B9,H?'); READLN(N,B0,B9,H);

K:=ROUND((B9-B0)/H+1.0); B:=B0; A:=0.0; S1:=0.0;

FOR I:= 1 TO K DO BEGIN TRAP(A,B,N,F,S); S1:=S1+S; A:=1.;

WRITELN(B,' ',C*S1); B:=B*H; END; UNTIL FALSE;END.


Формула СИМПСОНА

S= (b-a)/(6N)(f (x0) + f (x2N) + ∑i=12N-1 (3 + (-1) i-1) f (xi)) шаг:h=(b-a)/2N

Геометрическая интерпретация метода:

Пример программы на языке C#

Программа реализует оба метода – ТРАПЕЦИЙ и СИМПСОНА для функции f(x) с подбором шага интегрирования.


public double f(double x) {return x-Math.Cos(x);}


while (Math.Abs(r – r1) > p) { r1 = r; s=0; x=0;

if (radioButton1.Checked == true) k = n; else k = 2 * n;

h = (b – a) / k; for (int i=1;i<=k-1;i++) { x=x+h;

if (radioButton1.Checked == true) s = s + f(x);

else s = s+(3+Math.Pow(-1,i-1))*f(x); }

if (radioButton1.Checked == true) { r = h * (f(a) + f(b) + 2 * s) / 2; }

else { r = h * (f(a) + f(b) + s) / 3; }

n = n + 10; } textBox1.Text=Convert.ToString(r);

textBox2.Text=Convert.ToString(n);

Пример программы на языке Pascal

VAR I,K:INTEGER; Е,Z,Z0,Z9,H,S:REAL;

FUNCTION F(X:REAL):REAL;

BEGIN F:=SQRT(1.0-Z*SQR(SIN(X)); END;

PROCEDURE SIMPE(A,B,E:REAL; FUNCTION F:REAL;VAR S:REAL);

VAR I:INTEGER; C1,H,H2,S1,S2,S3,X:REAL;

BEGIN E1:=E*15.0; H:=(B-A)/2;

S:=2*F(A+H); S1:=F(A)+F(B)+S; S:=S1+S;

REPEAT S2:=0.0; S3:=S; H2:=H; H:=H/2; X:=A+H;

WHILE (X0.0) DO BEGIN S2:=S2+F(X); X:=X+H2; END; S2:=2*S2; S1:=S1+S2; S:=S1+S2; UNTIL ABS(1.0-S/(2*S3))<=C1; S:=S*H/3.0;END;

BEGIN

REPEAT WRITE ('C,Z0,Z9,H?');READLN(C,Z0,Z9,H); K:=ROUND((Z9-Z0)/Н+1.0); Z:=Z0;

FOR I:=1 TO К DO BEGIN SIMPE(0.0,3.1415925/2,E,F,S);

WRITELN(Z,' ',S); Z:=Z+H; END; UNTIL FALSE; END.

Пример программы на языке Basic

10 DEF FNA(Х) =SQR(1-Z*SIN(X)^2)

20 PRINT "E,Z0,Z9,H1";: INPUT E,Z0,Z9,H1

30 A=0 : B=PI/2

40 FOR Z=Z0 ТО Z9 STEP H1

50 GOSUB 100

40 PRINT Z,S : NEXT Z

90 GOTO 10

100 E1=E*15 : H=(B-A)/2

110 S=2*FNA(A+H) : S1=FNA(A)+FNA(B)+S : S=S1+S

120 S2=0 : S3=S : H2=H : H=H/2

130 FOR X=A+H TO В STEP H2 : S2=S2+FNA(X):NEXT X

140 S2=2*S2 : S1=S1+S2 : S=S1+S2

150 IF ABS(1-S/(2*S3))>E1 THEN 120

140 S=S*H/3

190 RETURN

Метод МОНТЕ-КАРЛО

Программно генерируются случайные числа и значение интеграла определяется как соотношение количества чисел, попавших в пределы функции, к общему количеству чисел.

Геометрическая интерпретация метода:

Пример программы на языке Basic

10 DEF FNY(X)=COS(P*X-Z*SIN(X))

20 PRINT "ВАРИАНТ"; : INPUT I

30 PRINT "N,P,Z"; : INPUT N,P,Z

35 A=0 : B=PI

40 IF I = 1 THEN GOSUB 100

50 IF I=2 THEN GOSUB 200

60 PRINT "S="S/PI

90 GO TO 20

100 H=B-A : S=0

110 FOR I = 1 TO N : S=S+FNY(A+RND(1)*H) : NEXT I

120 S=H*S/N

190 RETURN

200 H=B-A : S=0 : R=0

210 F=FNY(A+RND(1)*H)

215 IF RND(1)

220 R=R+1 : IF R< N THEN 210

230 S=H*S/N

290 RETURN

РЕШЕНИЕ НЕЛИНЕЙНЫХ УРАВНЕНИЙ ВИДА – ФУНКЦИЯ ОТ Х = 0

Метод половинного деления

Уравнение может быть записано в общем виде: F(X)=0.

Решение задачи состоит из двух этапов:

1) отделение корней – выделение отрезков [ab], принадлежащих области определения функции f(x), на которых расположен один и только один корень уравнения, то есть один нуль функции f(X).

2) уточнение корней с любой степенью точности – построение процесса, позволяющего как угодно сузить границы выделенного отрезка. Критерием является следующий: функция f(x) на отрезке [a b] должна быть непрерывна и монотонна, а ее значения на концах отрезка должны иметь разные знаки. Для отделения корней используются два метода.

Аналитический метод: Для отделения действительных корней необходимо указать интервалы монотонности функции f(x), т.е. интервалы, в которых знак первой производной постоянный, а для этого решить уравнение f′(x) = 0 и подсчитать значение функции f(x) в точках корней уравнения и в граничных точках области определения функции. Отрезки, на концах которых у функции разные знаки, содержат корень.

Графический метод: Нужно построить график функции f(x) и выделить отрезки, где функция непрерывна, монотонна и имеет разные знаки на его концах.


Алгоритм метода половинного деления:

Геометрическая интерпретация метода:

Решить задачу:

Методом половинного деления найти корень уравнения x-Cos(x)=0.

Пример программы на языке C#

double x, left = 0, right = 1;

do { x = ( left + right ) / 2;

if ( ( Math.Cos(x) – x ) * ( Math.Cos(left) – left ) < 0 )

right = x; else left = x; }

while ( Math.Abs( right – left ) >1e-4 );

Console.WriteLine( "Корень равен " + x );

Пример программы на языке Pascal

PROGRAM P9;

FUNCTION FUN(A:REAL):REAL;

BEGIN

FUN:=A-COS(A);

END;


VAR A,B,X:REAL;

BEGIN

WRITELN('Ввести интервал А и В для поиска корня = ');

READLN(A,B);

REPEAT X:=0.5*(A+B);

IF FUN(X)*FUN(A)<0 THEN B:=X ELSE A:=X;

UNTIL ABS(A-B)<1E-4;

WRITELN(' Корень уравнения ',X);

END.

(Тест: Интервал 0 и 1; Ответ = 0.73907470703125)

Решить задачу:

Найти корень уравнения на отрезке [1; 2] с точностью =10-4 методом половинного деления.

Пример программы на языке Pascal

CONST A = 1;B = 2;EPS = 1E-4;

VAR X1, X2, X, Y1, Y2: REAL;F : BOOLEAN;

BEGIN

X1 := A; X2 := B; F := TRUE;

WHILE F DO

IF ABS (X1 – X2) > EPS THEN

BEGIN

Y1 := COS(2/X1) – 2*SIN(1/X1) + 1/X1; X := (X1 + X2)/2;

Y2 := COS(2/X) – 2*SIN(1/X) + 1/X;

IF ABS(Y2) > EPS THEN

IF Y1*Y2 > 0 THEN X1:= X ELSE X2:= X

ELSE F := FALSE END ELSE F:= FALSE;

WRITELN (‘КОРЕНЬ УРАВНЕНИЯ ’,X);

END.

Ответ 1,875

Пример программы на языке Basic

10 DIM P(9)

20 PRINT " А,В,Е " ; : INPUT А,B,Е

30 PRINT "СКОЛЬКО ПАРАМЕТРОВ"; : INPUT N

40 FOR К=1 TO N : PRINT "Р"К; : INPUT Р(К) : NEXT К

50 GOSUB 100

60 PRINT "Х=”Х

90 GOТО 20

100 Х=А : GOSUB 200

110 S=SGN(F)

120 X = (А+В)/2 : GOSUB 200

130 IF ABS(F)<Р(2) THEN RETURN

140 IF SGN(F)=S THEN A=X : GOTO 160

150 B=X

160 IF B-A>E THEN 120

190 RETURN

200 R=1 : R1=SQR(1-Х)

210 R2=(R+R1) /2 : R1=SQR (R*R1) : R=R2

220 IF R-R1 >P(2) THEN 210

230 F=R*P(1)-PI/2

290 RETURN


Пример программы на языке Pascal

VAR P: ARRAY [1..9] OF REAL; A,B,X,E:REAL;N,K:INTEGER;

FUNCTION F(X:REAL):REAL;

VAR R,R1,R2: REAL;

BEGIN R:=1.0; R1:=SQRT (1.0-X); WHILE R-R1 >P[2] DO BEGIN

R2:=(R+R1)/2; R1:=SQRT(R*R1); R:=R2; END;

F:=(R+R1)*P[1]-3.14159265; END;


FUNCTION SGN(X:REAL):INTEGER;

BEGIN SGN:=0;

IF X<0.0 THEN SGN:=-1;

IF X>0.0 THEN SGN:=1; END;


PROCEDURE DICH(VAR A,В,X,E,E1:REAL; FUNCTION F:REAL);

VAR I:INTEGER; R:REAL;

BEGIN I:=SGN(F(A)); WHILE B-A>E DO BEGIN

X:= (A+B) /2; R:=F(X); IF ABS(R)

IF SGN(R)=I THEN A:=X ELSE B:=X;END;END;

BEGIN

REPEAT WRITE(‘A,B,E?'); READLN(A,В,E); WRITE('СКОЛЬКО ПАРАМЕТРОВ? '); READLN(N);

FOR K:=1 TO N DO BEGIN

WRITE(‘P(‘,K:2, ')? '); READLN (Р[К]);END;

DICH(A,B,X,E,P[2],F); WRITELN('X=’,X); UNTIL FALSE; END.

Метод итераций

Уравнение f(x)=0 представляется в виде x=φ(x),где φ(x)определяется одним из способов:

φ(x)= x – αf(x),где α=const

φ(x)= x + ρ(x)f(x), где ρ(x)-произвольная функция не имеющая корней на отрезке (a/b).

Метод простой итерации определяется формулой: xn+1=φ(xn), n=0,1,2,3… где n-номер итерации,x0-произвольно заданное начальное приближение.

Процесс сходится к корню уравнения, если на отрезке (ab) выполняется условие: φ′(x) <= q < 1.

Загрузка...