Я пытаюсь реализовать RK неявное уравнение для конвекции-диффузии (1D) с коэффициентами мяча fdm_2nd и gauss: 'u_t = -uu_x + nu .u_xx'.как реализовать newton-raphson для вычисления коэффициентов k (i) неявной руны kutta?
Моя цель - сравнить схему экспликации против схемы implcit. Явный rk, который хорошо работает с небольшим количеством вязкости. Кривая явной схемы показывает нам очень приятную ударную волну.
Мне нужна ваша помощь для правильной реализации решателя коэффициента k (i). Я не вижу, как реализовать метод newton для всех k (i). Мне нужно реализовать его для всех шагов времени? или как раз вовремя? Якобиан, возможно, ошибается, но я не вижу, где. Или, может быть, я использую джакобиан в неправильном направлении ...
Actualy, мой код работает, но я думаю, что это было где-то неправильно ... также неявная кривая не движется от начальных значений.
здесь моя функция:
function [t,u] = burgers(t0,U,N,dx)
nu=0.01; %coefficient de viscosité
A=(diag(zeros(1,N))-diag(ones(1,N-1),1)+diag(ones(1,N-1),-1))/(2*dx);
B=(-2*diag(ones(1,N))+diag(ones(1,N-1),1)+diag(ones(1,N-1),-1))/(dx).^2;
t=t0;
u = - A * U.^2 + nu .* B * U;
якобиан:
function Jb = burJK(U,dx,i)
%Opérateurs
a(1,1) = 1/4;
a(1,2) = 1/4 - (3).^(1/2)/6;
a(2,1) = 1/4 + (3).^(1/2)/6;
a(2,2) = 1/4;
Jb(1,1) = a(1,1) .* (U(i+1,1) - U(i-1,1))/ (2*dx) - 1;
Jb(1,2) = a(1,2) .* (U(i+1,1) - U(i-1,1))/ (2*dx);
Jb(2,1) = a(2,1) .* (U(i+1,2) - U(i-1,2))/ (2*dx);
Jb(2,2) = a(2,2) .* (U(i+1,2) - U(i-1,2))/ (2*dx) - 1;
Вот мой ньютон-код:
iter = 1;
iter_max = 100;
k=zeros(2,N);
k(:,1)=[0.4;0.6];
[w_1,f1] =burgers(n + c(1) * dt,uu + dt * (a(1,:) * k(:,iter)),iter,dx);
[w_2,f2] =burgers(n + c(2) * dt,uu + dt * (a(2,:) * k(:,iter)),iter,dx);
f1 = -k(1,iter) + f1;
f2 = -k(1,iter) + f2;
f(:,1)=f1;
f(:,2)=f2;
df = burJK(f,dx,iter+1);
while iter<iter_max-1 % K_newton
delta = df\f(iter,:)';
k(:,iter+1) = k(:,iter) - delta;
iter = iter+1;
[w_1,f1] =burgers(n + c(1) * dt,uu + dt * (a(1,:) * k(:,iter+1)),N,dx);
[w_2,f2] =burgers(n + c(2) * dt,uu + dt * (a(2,:) * k(:,iter+1)),N,dx);
f1 = -k(1,iter+1) + f1;
f2 = -k(1,iter+1) + f2;
f(:,1)=f1;
f(:,2)=f2;
df = burJK(f,dx,iter);
if iter>iter_max
disp('#');
else
disp('ok');
end
end