Найти
y’(0); y’’(0)=1; y’’’(0)=1;
обозначим у’(0) как С.
Решение:
Решение:
Система конечно-разностных уравнений
интервал [0,2] разделим на 10 точек
-2 1 0 0 0 0 0 0 0 0
0.041 -2 1 0 0 0 0 0 0 0
0.040 1 -2 1 0 0 0 0 0 0
0.040 0 1 -2 1 0 0 0 0 0
0.040 0 0 1 -2 1 0 0 0 0
0.040 0 0 0 1 -2 1 0 0 0
0.040 0 0 0 0 1 -2 1 0 0
0.040 0 0 0 0 0 1 -2 1 0
0.040 0 0 0 0 0 0 1 -2 1
0.040 0 0 0 0 0 0 0 1 -2
-2+0.045 точек.
1 | 0 | 0 | 0 | 0 | ||
1 | 1 | 0 | 0 | 0 | ||
0 | 1 | 1 | 0 | 0 | ||
0 | 0 | 1 | 1 | 0 | ||
0 | 0 | 0 | 1 | 0 |
АЛГОРИТМ ГАУССА
Назначение: Решить относительно Х.
Входные параметры: masheps
R, n Z,Вектор правых частей
.Входно - выходные параметры
,после разложения в А сохраняются ее верхние треугольные сомножители
, .Код возврата retcode=0 при успешном решении и retcode=1 при вырождении матрицы.
Выходные параметры:
.Алгоритм
1. retcode=0
2. if n=1 then
2.1 if A[1,1]=0 then retcode=1
2.2 return
(*Гауссово исключение с частичным выбором ведущего элемента*)
3. for k=1 to n do (*найти ведущий элемент*)
3.1 Amax <= |A[k,k]|
3.2 Imax <= k
3.3 for i=k+1 to n do
3.3.1 if |[i,k]| > Amax then
3.3.1.1. Amax <= |A[i,k]|
3.3.1.2. Imax <= 1
(*проверка на вырожденность*)
3.4. if Amax < masheps*n then
3.4.1. retcode<=1
3.4.2. return
3.5. if Imax<> k then
3.5.1. Amax <= A[Imax,k]
3.5.2. A[Imax,k] <= A[k,k]
3.5.3. A[Imax,k] <= Amax
3.7. for i=k+1 to n do A[i,k] <= A[i,k]/Amax
(*перестановка и исключение по столбцам*)
3.8. for j=k+1 to n do
3.8.1. Amax<=A[Imax,j]
3.8.2. A[Imax,j]<=A[k,j]
3.8.3. A[k,j]<=Amax
3.8.4. if Amax<>0 then
for i=k+1 to n do
A[i,j]<=A[i,j]-A[i,k]*Amax
4. if retcode=0 then (*разложение успешно*)
(*решить СЛУ Ly=b и Vx=y *)
5. for i=2 to n do
6. for k=n downto 1 do
return
end.
АЛГОРИТМ ЯКОБИ
Входные параметры:
- вектор начальных значений Х, после окончания решения с заданной точностью.Код возврата: retcode=0 при успешном решении u=1, при не успешном решении превышение допустимого числа итераций.
Память: Требуется дополнительный массив
для хранения невязок.Алгоритм
retcode=1
for Iter=1 to maxiter do (*расчет вектора невязок*)
rmax=0
for i=1 to n do
(*проверка на окончание итерационного процесса*)
if rmax<eps then do retcode=0
return
(*найти улучшенное решение*)
for i=1 to n do
x[i]=x[i]+r[i]/A[i,j]
АЛГОРИТМ ГАУССА-ЗЕЙДЕЛЯ
Входные параметры:
( релаксационный коэффициент )
- точность решения,maxiter- максимальное число итераций.
Входно- выходные параметры:
- вектор начальных значений X, после окончания; решение с заданной точностью.Алгоритм
retcode=1
for iter=1 to maxiter do
rmax=0
(*улучшить решение*)
for i=1 to n do
(*проверка на окончание итерационного процесса*)
if rmax<eps then
retcode=0
return
program GAUS1(input,output);
type
matrix=array[1..100,1..100] of real;
vektor=array[1..100] of real;
var
a:matrix;
x,b,y:vektor;
n:integer;
ret_code:integer;
procedure geradlini(var a:matrix;var b,y:vektor;var n:integer);
var
s:real;j,i:integer;
begin
for i:=1 to n do
begin
s:=0;
for j:=1 to (i-1) do
s:=s+a[i,j]*y[j];
y[i]:=b[i]-s;
end;
end;
procedure ruckgang(var a:matrix;var y,x:vektor;var n:integer);
var
s:real;i,j:integer;
begin
s:=0;
for i:=n downto 1 do
begin
s:=0;
for j:=(i+1) to n do
s:=s+a[i,j]*x[j];
x[i]:=(y[i]-s)/a[i,i];
end;
end;
procedure vvod(var a:matrix;var b:vektor;var n:integer);
var
i,j:integer;
q:real;
begin
writeln('Введите количество точек на интервал: ');
readln(n);
for i:=1 to n do
begin
for j:=1 to n do
a[i,j]:=0;
a[i,i]:=(-2);
end;
for i:=1 to (n-1) do
a[i,i+1]:=1;
for i:=2 to n do
a[i,i-1]:=1;
q:=sqr(2/n);
for i:=1 to n do
if i<>n then b[i]:=q else b[i]:=(q-2);
end;
procedure triangul(var a:matrix;var b:vektor;
var ret_code:integer;n:integer);
label 1;
var
eps,buf,max,c:real;
k,imax,i,j:integer;
begin
ret_code:=1;
eps:=1;
buf:=1+eps;
while buf>1.0 do
begin
eps:=eps/2;
buf:=1+eps;
end;
buf:=n*eps;
for k:=1 to (n-1) do
begin
max:=a[k,k];
imax:=k;
for i:=k to n do
if a[i,k]>max then
begin
max:=a[i,k];
imax:=i;
end;
if a[imax,k]>buf then
begin
for j:=1 to n do
begin
c:=a[imax,j];
a[imax,j]:=a[k,j];
a[k,j]:=c;
end;
c:=b[imax];
b[imax]:=b[k];
b[k]:=c;
for i:=(k+1) to n do
begin
a[i,k]:=a[i,k]/a[k,k];
for j:=(k+1) to n do
a[i,j]:=a[i,j]-a[i,k]*a[k,j];
end;
end
else
begin
ret_code:=0;
goto 1
end;
1: end;
end;
procedure vivod(var x:vektor;var n:integer);
var
i:integer;
begin
for i:=1 to n do
writeln('x',i:1,'=',x[i],' ');
end;
begin
vvod(a,b,n);
triangul(a,b,ret_code,n);
if ret_code=1 then
begin
geradlini(a,b,y,n);
ruckgang(a,y,x,n);
vivod(x,n);
end
else
writeln('Матрица вырожденна');
end.
program GAUS2(input,output);
type
matrix=array[1..100,1..100] of real;
vektor=array[1..100] of real;
var
a:matrix;
x,b,y:vektor;
n:integer;
ret_code:integer;
procedure geradlini(var a:matrix;var b,y:vektor;
var n:integer);
var
s:real;j,i:integer;
begin
for i:=1 to n do
begin
s:=0;
for j:=1 to (i-1) do
s:=s+a[i,j]*y[j];
y[i]:=b[i]-s;
end;
end;
procedure ruckgang(var a:matrix;var y,x:vektor;
var n:integer);
var
s:real;i,j:integer;
begin
s:=0;
for i:=n downto 1 do
begin
s:=0;
for j:=(i+1) to n do
s:=s+a[i,j]*x[j];
x[i]:=(y[i]-s)/a[i,i];
end;
end;
procedure vvod(var a:matrix;var b:vektor;
var n:integer);
var
i,j:integer;
q:real;
begin
writeln('Введите количество точек на интервал: ');
readln(n);
q:=(-2+sqr(0.5/n)*(sqr(4*arctan(1))/4));
for i:=1 to n do
begin
for j:=1 to n do
a[i,j]:=0;
a[i,i]:=(q);
end;
for i:=1 to (n-1) do
a[i,i+1]:=1;
for i:=2 to n do
a[i,i-1]:=1;