直接写了个对的,也没写成复杂的矩阵运算格式,你去看看我推荐的讲偏微分方程的书籍的对应章节再对照代码吧。
clear; clc; close all;
c = 4;
X_min = 0; X_Step = 1/10; X_max = 1;
T_min = 0; T_Step = 0.025; T_max = 1;
F = @( x ) sin( pi * x );
G = @( x ) 0 * x;
X_Vector = X_min : X_Step : X_max;
T_Vector = T_min : T_Step : T_max;
lambda = c * T_Step / X_Step;
U_Matrix = NaN * ones( numel( X_Vector ), numel( T_Vector ) );
U_Matrix( 1, : ) = 0; U_Matrix( end, : ) = 0;
U_Matrix( :, 1 ) = F( X_Vector ).';
U_Matrix( 2 : end - 1, 2 ) = ( lambda^2 * ( F( X_Vector( 1 : end - 2 ) ) + F( X_Vector( 3 : end ) ) ) / 2 + ...
( 1 - lambda^2 ) * F( X_Vector( 2 : end - 1 ) ) + T_Step * G( X_Vector( 2 : end - 1 ) ) ).';
for jj = 3 : 1 : numel( T_Vector )
U_Matrix( 2 : end - 1, jj ) = lambda^2 * ( U_Matrix( 1 : end - 2, jj - 1 ) + U_Matrix( 3 : end, jj - 1 ) ) + ...
( 1 - lambda^2 ) * 2 * U_Matrix( 2 : end - 1, jj - 1 ) - U_Matrix( 2 : end - 1, jj - 2 );
end
[ X_Matrix, T_Matrix ] = meshgrid( X_Vector, T_Vector );
U_Analytic = @( x, t ) sin( pi * x ) .* cos( c * pi * t );
U_AnaMatrix = U_Analytic( X_Matrix, T_Matrix );
%%
figure;
subplot( 1, 2, 1 )
surf( X_Matrix, T_Matrix, U_Matrix.',...
'FaceColor', 'r', 'FaceAlpha', 0.7, 'MeshStyle', 'default', 'EdgeColor', 'k', 'EdgeAlpha', 0.6, ...
'AlignVertexCenters', 'on', 'LineStyle', ':', 'LineWidth', 0.8 );
xlabel( 'x', 'FontSize', 18 ); ylabel( 't', 'FontSize', 18 ); zlabel( 'u_{numeric}', 'FontSize', 18 );
axis equal; grid on;
subplot( 1, 2 ,2 )
surf( X_Matrix, T_Matrix, U_AnaMatrix,...
'FaceColor', 'b', 'FaceAlpha', 0.7, 'MeshStyle', 'default', 'EdgeColor', 'k', 'EdgeAlpha', 0.6, ...
'AlignVertexCenters', 'on', 'LineStyle', ':', 'LineWidth', 0.8 );
xlabel( 'x', 'FontSize', 18 ); ylabel( 't', 'FontSize', 18 ); zlabel( 'u_{analytic}', 'FontSize', 18 );
axis equal; grid on;