ici vs affichage math.stackexchange parce que je pense que ma question est la syntaxe:Pourquoi la sortie MATLAB de cette méthode numérique n'est-elle pas plus précise?
Je suis en train d'analyser le 2ème ordre ODE: y '' + 2y » + 2y = e^(- x) * sin (x) en utilisant le code MATLAB pour la méthode du point médian. J'ai d'abord converti l'ODE en un système d'équations de 1er ordre, puis j'ai essayé de l'appliquer ci-dessous, mais comme les discrétisations [m] sont augmentées, la sortie s'arrête à .2718. Par exemple, m = 11 rendements:
ans =
0.2724
et m = 101:
ans =
0.2718
et m = 10001
ans =
0.2718
Voici le code:
function [y,t] = ODEsolver_midpointND(F,y0,a,b,m)
if nargin < 5, m = 11; end
if nargin < 4, a = 0; b = 1; end
if nargin < 3, a = 0; b = 1; end
if nargin < 2, error('invalid number of inputs'); end
t = linspace(a,b,m)';
h = t(2)-t(1);
n = length(y0);
y = zeros(m,n);
y(1,:) = y0;
for i=2:m
Fty = feval(F,t(i-1),y(i-1,:));
th = t(i-1)+h/2;
y(i,:) = y(i-1,:) + ...
h*feval(F,th,y(i-1,:)+(h/2)*Fty);
end
séparée fichier:
function F = Fexample1(t,y)
F1 = y(2);
F2 = exp(-t).*sin(t)-2.*y(2)-2.*y(1);
F = [F1,F2];
Troisième fichier:
[Y,t] = ODEsolver_midpointND('Fexample1',[0 0],0,1,11);
Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)- t.*cos(t))];
norm(Y-Ye,inf)
Je pense que matlab n'affiche que quatre chiffres mais la précision augmente encore. Vous pouvez changer le format d'affichage de sortie avec la commande 'format'. Essayez d'ajouter cette ligne: 'format long' avant d'imprimer la valeur. – obchardon
Merci. Tu as raison de dire que ça change un peu, mais c'est quand même beaucoup plus lent que prévu. Et pour m = 101 il donne ans = 0.271778245788821, mais pour m = 1001 donne ans = 0.271782072082206 qui est plus grand! Donc, j'ai définitivement fait quelque chose de mal. – xq1515426