Problema matlab
Ciao, ho il seguente problema differenziale ai valori iniziali
\(\displaystyle y′1 (t) = −2y1(t)y2(t)\)
\(\displaystyle y′2 (t) = y1(t)^2 − y2(t)^2 + y3(t)^2 − 1\)
\(\displaystyle y′3 (t) = −2(y1(t) + y2(t))y3(t)\)
\(\displaystyle y1(0) = y2(0) = y3(0) = 1 \)
Con tableau
Devo calcolare numericamente l'ordine.
Io ho scritto il seguente codice
Questo codice chiaramente ha dei problemi ma non so come modificarlo per farlo funzionare.
Grazie
\(\displaystyle y′1 (t) = −2y1(t)y2(t)\)
\(\displaystyle y′2 (t) = y1(t)^2 − y2(t)^2 + y3(t)^2 − 1\)
\(\displaystyle y′3 (t) = −2(y1(t) + y2(t))y3(t)\)
\(\displaystyle y1(0) = y2(0) = y3(0) = 1 \)
Con tableau
| 0 | 1 | |
| 1/2 | 1/2 |
Devo calcolare numericamente l'ordine.
Io ho scritto il seguente codice
clear all
close all
clc
mrif = 1000;
m = mrif;
A = [0,0;1/2,1/2];
b = [1/2,1/2];
c = [0,1];
tspan = [0,1];
Y = zeros(3,m+1); % Matrice che memorizza le iterazioni
y0=[1;1;1];
Y(:,1) = y0;
odefun = @(x) [-2*x(1)*x(2);(x(1))^2-(x(2))^2+(x(3))^2 -1;-2*(x(1)+x(2))*x(3)];
odeJf = @(x) [-2*x(2),-2*x(1),0; 2*x(1),-2*x(2),2*x(3);-2*x(3),-2*x(3),-2*(x(1)+x(2))];
k = 2^(-12);
m = floor((tspan(2)-tspan(1))/k)+1;
tout = zeros(1,m+1);
tout(1) = tspan(1);
yout = zeros (length(y0),m+1); % m+1 colonne per farci stare anche la soluzione iniziale
yout(:,1) = y0;
for n = 1:m
if n == m
k = tspan(2)-tout(n);
tout(n+1) = tspan(2);
else
tout(n+1) = n*k;
end
% Ciclo per costruire le fi
for i = 1:length(b)
somma = zeros(length(y0),1);
for j = 1:i-1
somma = somma + A(i,j)*f(:,j);
end
% lo zero di F(x) sara' f(:,i)
F = @(x) x - odefun(tout(n)+c(i)*k, yout(:,n)+k*somma + k*A(i,i)*x);
J = @(x) eye(length(y0)) - ...
odeJf(tout(n)+c(i)*k, yout(:,n) + k*somma + k*A(i,i)*x)...
*k*A(i,i);
y = yout(:,n); % valore iniziale
delta = -J(y)\F(y);
tol = 1e-10;
while (norm(delta,inf)>tol)
y = y + delta;
delta = -J(y)\F(y);
end
f(:,i) = y;
end
somma = zeros(length(y0),1);
for j=1:length(b)
somma = somma + b(j)*f(:,j);
end
yout(:,n+1) = yout(:,n) + k*somma;
end
yout = yout';
yrif = yout(end,:);
counter = 0;
for h = 4:1:8
k = 2^(-h);
counter = counter + 1;
m = floor((tspan(2)-tspan(1))/k)+1;
tout = zeros(1,m+1);
tout(1) = tspan(1);
yout = zeros (length(y0),m+1); % m+1 colonne per farci stare anche la soluzione iniziale
yout(:,1) = y0;
for n = 1:m
if n == m
k = tspan(2)-tout(n);
tout(n+1) = tspan(2);
else
tout(n+1) = n*k;
end
% Ciclo per costruire le fi
for i = 1:length(b)
somma = zeros(length(y0),1);
for j = 1:i-1
somma = somma + A(i,j)*f(:,j);
end
% lo zero di F(x) sara' f(:,i)
F = @(x) x - odefun(tout(n)+c(i)*k, yout(:,n)+k*somma + k*A(i,i)*x);
J = @(x) eye(length(y0)) - ...
odeJf(tout(n)+c(i)*k, yout(:,n) + k*somma + k*A(i,i)*x)...
*k*A(i,i);
y = yout(:,n); % valore iniziale
delta = -J(y)\F(y);
tol = 1e-10;
while (norm(delta,inf)>tol)
y = y + delta;
delta = -J(y)\F(y);
end
f(:,i) = y;
end
somma = zeros(length(y0),1);
for j=1:length(b)
somma = somma + b(j)*f(:,j);
end
yout(:,n+1) = yout(:,n) + k*somma;
end
yout = yout';
L(counter) = length(tout);
Y(counter) = yout(end,:);
errore(counter) = norm(norm(yrif,inf)-norm(Y(counter),inf),inf);
end
figure
loglog(L,errore,'-*',L,L.^(-1),'k',L,L.^(-2),'r',L,L.^(-3),'g',L,L.^(-4),'y');
legend('errore','pendenza -1','pendenza -2','pendenza -3','pendenza -4');
figure
Questo codice chiaramente ha dei problemi ma non so come modificarlo per farlo funzionare.
Grazie
Risposte
prova a fare un array lineare e un reshape di counter...così dovrebbe funzionare!