2016-11-14 1 views
1

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) 
+0

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

+0

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

Répondre

0

Votre solveur ODE me semble que cela devrait fonctionner - mais il y a une faute de frappe dans la solution analytique vous comparez à. Il devrait être

Ye = [(1./2).*exp(-t).*(sin(t)-t.*cos(t)) (1./2).*exp(-t).*((t-1).*sin(t)+ t.*cos(t))]; 

dire avec un signe + avant le terme t.*cos(t) dans le dérivé.

+0

Merci beaucoup. Je l'avais regardé depuis si longtemps et je n'avais toujours pas pu voir ça. – xq1515426