Смекни!
smekni.com

Электроснабжение (стр. 2 из 3)

Найти

y’(0); y’’(0)=1; y’’’(0)=1;

обозначим у(0) как С.

Решение:

Решение:


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

интервал [0,2] разделим на 10 точек

-2 1 0 0 0 0 0 0 0 0

0.04

1 -2 1 0 0 0 0 0 0 0

0.04

0 1 -2 1 0 0 0 0 0 0

0.04

0 0 1 -2 1 0 0 0 0 0

0.04

0 0 0 1 -2 1 0 0 0 0

0.04

0 0 0 0 1 -2 1 0 0 0

0.04

0 0 0 0 0 1 -2 1 0 0

0.04

0 0 0 0 0 0 1 -2 1 0

0.04

0 0 0 0 0 0 0 1 -2 1

0.04

0 0 0 0 0 0 0 0 1 -2

-2+0.04

5 точек.

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;