Добрый день. Помогите, пожалуйста, исправить программу. Не верно считает коэффициенты матрицы, хотя все вроде должно быть пучком.
Есть задание
Решить краевую задачу для обыкновенных дифференциальных уравнений методом конечных разностей.Краевая задача:
где
- шаг разбиения, нужен для программы.
Для решения
конкретно этих условий, я написал программу, которая находит коэффициенты СЛАУ (и пишет их в D:\1.TXT).
arr[i,j] - матрица; brr[i] - столбец свободных коєфициентов.
Код:
const k1=-1;
k2=-4.8;
a0=5;
a1=0;
b0=0;
b1=-5;
AA=1;
BB=0.5;
var h:real;
a,b:integer;
arr:array [0..20,0..20] of real;
brr:array [0..20] of real;
i,j:integer;
x:array [0..20] of real;
y:array [0..20] of real;
n:integer;
fil:text;
function p (var cof:real):real;
begin
p:=k1-cof;
end;
function q (var cof:real):real;
begin
q:=k2+(cof*cof*cof);
end;
function f (var cof:real):real;
begin
f:=sqrt(cof*cof+k2*k2);
end;
BEGIN
assign(fil,'d:\1.txt');
rewrite(fil);
a:=2;
b:=3;
h:=0.1;
n:=(b-a)*10;
for i:=0 to n do begin
for j:=0 to n do begin
arr[i,j]:=0; end;end;
arr[0,0]:=a0-3.0*a1/(2.0*h);
arr[0,1]:=2.0*a1/h;
arr[0,2]:=a1/(2.0*h);
brr[0]:=AA;
for i:=1 to (n-1) do
begin
x[i]:=a+i*h;
arr[i,i-1]:=1.0/(h*h)-p(x[i])/(2.0*h);
arr[i,i]:=-2.0/(h*h)+q(x[i]);
arr[i,i+1]:=1.0/(h*h)+p(x[i])/(2.0*h);
brr[i]:=f(x[i]);
end;
arr[n,n-2]:=b1/(2.0*h);
arr[n,n-1]:=-b1/h;
arr[n,n]:=b0+3.0*b1/(2.0*h);
brr[n]:=BB;
for i:=0 to n do begin
for j:=0 to n do begin
write (fil,{'arr[',i,',',j,']:= ',}arr[i,j]:4:2,#09,#09);
end;
writeln(fil,#13);
end;
writeln(fil,#13);
writeln(fil,#13);
writeln(fil,#13);
for i:=0 to n do begin
writeln (fil,'brr[',i,']= ',brr[i]:4:2,' ');
end;
END.
Писал по вот этой блок-схеме:
В данной блок-схеме:
- количество отрезков разбиения,
,
- левая и правая граница отрезка,
- константы из краевых условий,
- шаг разбиения,
- система равноудалены точек,
- приближенные значения решения краевой задачи,
- значение функций
из дифференциального уравнения в точке
- подпрограмма решения системы линейных алгебраических уравнений методом Гаусса (
- матрица постоянных коэффициентов,
- количество уравнений,
- вектор-столбец свободных членов,
- вектор-столбец неизвестных.
Единственное, что не совпадает, так это нет подпрограммы решения СЛАУ методом Гауса (gaus()). У меня есть отдельная программа, работающая 100% и мне лень переписывать текст каждый раз, как она нужна где-то в др. программе:).
Ответы не совпадают с ответами у преподавателя.
Так же, если у вас, вдруг, есть программа, которая мне поможет, я ее с удовольствием использую. Т.к. преподавателя интересует конкретно ответ, а не то, каким образом я к нему пришел.