Ciao, ho dei problemi nell'implementazione su MATLAB di un runge-kutta implicito generico con il metodo di Newton, nel senso che a me i codici sembrano giusti, li ho ricontrollati più e più volte ma non funziona, qualcuno riesce a darmi una mano? A è la matrice di Butcher, b e c i vettori del metodo
function y = rkimplis(f, Jf, y0, t0, t1, h, c, b, A, toll, nMax)
n = ceil((t1-t0)/h);
t = t0;
s = length(c);
d = length(y0);
k = zeros(s,d);
kk = zeros(1,s*d);
y = zeros(n+1,d);
y(1,:) = y0;
for l=1:n
iter = 0;
err = 100;
while(err>toll && iter<nMax)
iter = iter + 1;
J = eye(s*d,s*d);
F = zeros(1,s*d);
for i=1:s
J_block = Jf(t+c(i)*h,y(l,:)+h*A(i,:)*k);
%for j=1:s
%J((i-1)*d+1:i*d,(j-1)*d+1:j*d) = J((i-1)*d+1:i*d,(j-1)*d+1:j*d) - h*A(i,j)*J_block;
%end
J((i-1)*d+1:i*d,:) = J((i-1)*d+1:i*d,:) - h*kron(A(i,:),J_block);
end
for i=1:s
F(1,(i-1)*d+1:i*d) = - kk((i-1)*d+1:i*d) + f(t+c(i)*h,y(l,:)+h*A(i,:)*k);
end
kk_temp = J\F';
err = norm(kk_temp,'inf');
kk = kk_temp' + kk;
for i=1:s
k(i,:) = kk((i-1)*d+1:i*d);
end
end
y(l+1,:) = y(l,:) + h*b*k;
if(t+h>t1)
h = t1 - t;
t = t1;
else
t = t + h;
end
end
return