Bonjour,
je suis d'accord, j'ai fais tourner votre programme et je l'ai comparer avec le résultat fourni par la fonction ODE, tout est OK sauf Xexact qui a quand même la même allure à un facteur d'échelle près.
voici votre programme avec la fonction f que j'ai codée
clc
clf
clear
function ft=f(t)
if t < 1 then
ft=t // monté
elseif t >2 then
ft=0
else
ft=2-t // descente
end
endfunction
[ok,h]=getvalue("choix du pas",["h"],list("vec",1),["0.05"]);
t=[0:h:50]';
N=prod(size(t))
A=[0,1;-1,-0.5]
B=[0;1]
I=eye(2,2)
//f=ones(N,1)
Xexact=zeros(2,N); Xexpl=zeros(2,N); Ximpl=zeros(2,N); Xtrap=zeros(2,N);
for n=2:N
Xexpl(:,n)=(I+h*A)*Xexpl(:,n-1)+h*B*f(n*h);
Ximpl(:,n)=inv(I-h*A)*(Ximpl(:,n-1)+h*B*f(n*h));
Xtrap(:,n)=inv(I-h*A/2)*((I+h*A/2)*Xtrap(:,n-1)+h*B/2*(f(n*h)+f((n-1)*h)));
Xexact(:,n) = t(n)*(-0.5+t(n)+(exp(-t(n)/4)/2)*cos((sqrt(15)/4)*t(n))-(7/(2*sqrt(15)))*(exp(-t(n)/4)/2)*sin((sqrt(15)/4)*t(n)))+(t(n)-1)*(1-2*(t(n)-1)-(exp(-(t(n)-1)/4))*cos((sqrt(15)/4)*(t(n)-1))+(7/(sqrt(15)))*(exp(-(t(n)-1)/4)/2)*sin((sqrt(15)/4)*(t(n)-1)))+(t(n)-2)*(-0.5+t(n)-2+(exp(-(t(n)-2)/4)/2)*cos((sqrt(15)/4)*(t(n)-2))-(7/(2*sqrt(15)))*(exp(-(t(n)-2)/4)/2)*sin((sqrt(15)/4)*(t(n)-2)))
end
n=2:N
length(t)
length(Xexpl(1,: ))
length(Ximpl(1,: ))
length(Xtrap(1,: ))
length(Xexact(1,: ))
plot2d(t,Xexpl(1,: ),1)
plot2d(t,Ximpl(1,: ),2)
plot2d(t,Xtrap(1,: ),3)
plot2d(t,Xexact(1,: ),21)
legends(['Xexpl','Ximpl','Xtrap','Xexact'],[1,2,3,21])
xlabel('t')
ylabel('x(t)')
xgrid();