Для явной схемы:
% <<< Явная схема >>>
clc;
M = input('Введите число отрезков на осиX:');
N = input('Введите число отрезков на оси T:');
tau = 1/N;
h = 1/M;
nu = 4;
fu = 10*pi;
u = zeros(M+1,N+1);
i = 0;
j = 0;
% <<< Вычисление матрицы решений >>>
for i = 1:M+1
u(i,1) = defp((i-1)*h);
end;
for j = 1:N+1
u(M+1,j)=nu;
end
for j = 1:N
for i = 2:1:M
u(i,j+1)=u(i,j)+(tau/(h^2))*(u(i-1,j)-2*u(i,j)+u(i+1,j))+tau*deff((i-1)*h);
end;
end;
for j = 2:N+1
u(1,j) = (u(2,j) - ((h^2)/(2*tau))*u(1,j-1) + ((h^2)/2)*deff(0)-h*fu)/(1+(h^2)/(2*tau));
end;
% <<< Вывод результата >>>>
%u
pause
max = u(1,1);
min = u(1,1);
x = 0:h:1;
t = 0:tau:1
V = zeros(20,1);
for i=1:1:M+1
for j=1:1:N+1
if max<u(i,j)
max = u(i,j);
end;
if min>u(i,j)
min = u(i,j);
end;
end;
end;
v = min:(max-min)/21:max;
contour(u,v,t,x);
grid;
xlabel(' T ');
ylabel(' X ');
pause
for rotv = 0:30:180
for rotg = 0:30:180
mesh(u,[rotv,rotg])
pause
end;
end;
Для неявной схемы:
% <<< Неявная схема >>>
clc;
clear;
%for ncycle = 1:1:2
M = input('Введите число отрезков на осиX:');
N = input('Введите число отрезков на оси T:');
h = 1/M;
tau = 1/N;
u = zeros(M+1,N+1);
alfa = zeros(M+1,1);
beta = zeros(M+1,1);
i = 0;
j = 0;
for i=1:M+1
u(i,1)=defp((i-1)*h);
end;
% <<< вычисление коэффициентов для метода прогонки >>>
c0 = 1+(h^2)/(2*tau);
b0 = 1;
ai = 1;
ci = 2+(h^2)/tau;
bi = 1;
am = 0;
cm = 1;
fm = 4;
alfa(2) = b0/c0;
for i=3:1:M+1
alfa(i) = bi/(ci-ai*alfa(i-1));
end;
% <<< основной цикл >>>
for j=2:1:N+1
f0 = (h^2)*u(1,j-1)/(2*tau) + (h^2)*deff(0)/2 - h*10*pi;
beta(2) = f0/c0;
for i=3:1:M+1
fi = (h^2)*deff((i-2)*h) + (h^2)*u(i-1,j-1)/tau;
beta(i) = (fi + ai*beta(i-1))/(ci - ai*alfa(i-1));
end;
u(M+1,j) = (fm + am)/(cm - am*alfa(M+1));
for i=M:-1:1
u(i,j) = alfa(i+1)*u(i+1,j) + beta(i+1);
end;
end;
% <<<Оценка >>>
%if ncycle == 1
% u1 = u;
% M1 = M;
% N1 = N;
%end;
%end;
%Q = 0;
%for j = 1:1:N1
%for i = 1:1:M1
%rif = floor(i*(M+1)/(M1+1));
%ric = ceil(i*(M+1)/(M1+1));
%rjf = floor(j*(N+1)/(N1+1));
%rjc = ceil(j*(N+1)/(N1+1));
%tu = u(rif,rjf)+(u(ric,rjf)-u(rif,rjf))*(i*M/M1-rif)+(u(rif,rjc)-u(rif,rjf))*(j*N/N1-rjf);
%Q = Q + (u1(i,j)-tu)^2;
%end;
%end;
%disp(sqrt(Q));
%pause;
%return;
% <<< Вывод результатов >>>>
max = u(1,1);
min = u(1,1);
x = 0:h:1;
t = 0:tau:1
v = zeros(21,1);
for i=1:1:M+1
for j=1:1:N+1
if max<u(i,j)
max = u(i,j);
end;
if min>u(i,j)
min = u(i,j);
end;
end;
end;
v = min:(max-min)/21:max;
contour(u,v,t,x);
grid;
xlabel(' T ');
ylabel(' X ');
pause
for rotv = 0:30:180
for rotg = 0:30:180
mesh(u,[rotv,rotg]);
pause;
end;
end;
Рисунок
3.
Рисунок
4.
Рисунок
5.
Рисунок
6.
Рисунок
7.