алгоритм рунге-кутта maple. перевести его в delphi. у меня получается много косяков при переводе.
Код:
#Метод Рунге-Кутты для решения дифференциального уравнения
> restart:
> Digits:=40:
> #Задаём число стадий
> s:=4:#Число стадий
> #Задаём функцию
> F:=proc(t,y):
> y+t-t
> end proc:
> #Задаём матрицы А, С и B
> C:=Matrix(s,1):
> C[1,1]:=0:
> C[2,1]:=0.5:
> C[3,1]:=0.5:
> C[4,1]:=1:
>
> B:=Matrix(1,s):
> B[1,1]:=1/6:
> B[1,2]:=2/6:
> B[1,3]:=2/6:
> B[1,4]:=1/6:
>
> A:=Matrix(s,s):
> A[2,1]:=1/2:
> A[3,2]:=1/2:
> A[4,3]:=1:
> #Задаём текущий момент времени и шаг
> n:=32:#Количество моментов времени
> t_Nach:=0:#Начало отрезка
> t_Kon:=1:#Конец отрезка
> tao:=(t_Kon-t_Nach)/n:#Тао
>
> #Задаём значение функции в начальный момент времени
> yt:=1:#Начальный момент
> print(A);
> print(B);
> print(C);
[ 0 0 0 0]
[ ]
[1/2 0 0 0]
[ ]
[ 0 1/2 0 0]
[ ]
[ 0 0 1 0]
[1/6 1/3 1/3 1/6]
[ 0 ]
[ ]
[0.5]
[ ]
[0.5]
[ ]
[ 1 ]
> #Расчитываем вспомогательные наклоны
> K:=Matrix(1,s):
> KKK:=proc(t_Nach,C,K,s,A,tao,yt):
> sum:=0:
> tt:=t_Nach+C[1,1]:
> yy:=yt:
> K[1,1]:=F(tt,yy):
> for i from 1 to s do
> for j from 1 by 1 to (i-1) do
> sum:=sum+A[i,j]*K[1,j]:
> end do:
> sum:=sum*tao:
> yyy:=sum+yt:
> ttt:=t_Nach+C[i,1]*tao:
> K[1,i]:=evalf(F(ttt,yyy)):
> end do:
> return (K):
> end proc:
>
>
Warning, `sum` is implicitly declared local to procedure `KKK`
Warning, `tt` is implicitly declared local to procedure `KKK`
Warning, `yy` is implicitly declared local to procedure `KKK`
Warning, `i` is implicitly declared local to procedure `KKK`
Warning, `j` is implicitly declared local to procedure `KKK`
Warning, `yyy` is implicitly declared local to procedure `KKK`
Warning, `ttt` is implicitly declared local to procedure `KKK`
>
>
> yttaoo:=proc(s,B,K,yt,tao):
> sum:=0:
> for j from 1 to s do
> sum:=sum+(B[1,j]*K[1,j]):
> end do:
> asd:=yt+tao*sum:
> return(asd):
> end proc:
>
>
Warning, `sum` is implicitly declared local to procedure `yttaoo`
Warning, `j` is implicitly declared local to procedure `yttaoo`
Warning, `asd` is implicitly declared local to procedure `yttaoo`
> Y:=Matrix(1,n):
> for i from 1 by 1 to n do
> K:=KKK(t_Nach,C,K,s,A,tao,yt):
> yt:=yttaoo(s,B,K,yt,tao):
> Y[1,i]:=yt:
> t_Nach:=t_Nach+tao:
> end do:
> print(Y[1,n]);
>
>
2.718941860549627544346086618485529555134
> #Порядок метода (т.к. s=4 порядок должен быть 4)
> finalValue:=Matrix(3,1):
> finalValue[1,1]:=2.728640785790145138341452719247184512105:
> finalValue[2,1]:=2.720906309355404183949589396368652697902:
> finalValue[3,1]:=2.718941860549627544346086618485529555134:
> p:=log[2]((finalValue[2,1]-finalValue[1,1])/(finalValue[3,1]-finalValue[2,1])):
0.9885895321717369456882271753701817238194,
0.9885895321717369456882271753701817238194 -
4.532360141827193809627682945716666810172 I
p := 1.977179064343473891376454350740363447639
>