使用 FDM 的 Matlab 2D 波动方程

Posted

技术标签:

【中文标题】使用 FDM 的 Matlab 2D 波动方程【英文标题】:Matlab 2D wave equation using FDM 【发布时间】:2015-09-10 13:28:09 【问题描述】:

以下是我的 Matlab 代码,用于使用 FDM 模拟以高斯源为中心的 2D 波动方程。我使用 imagesc 函数输出波。波浪似乎从中心向外扩散,但非常缓慢。好像我把它搞砸了。并且输出非常像素化。我做错了什么?

clc
close all
clear all

c0 = 3e1;         % speed of light or any wave
e0 = 8.854e-12;   % free space permittivity
u0 = 1.2566e-6;   % free space permeability

size=170;        % size of free space

s=size;            % s determines the position of the source in the free space




dx=0.001;        % spatial increment

dt=dx/(c0);   % time increment

cons=c0*dt/dx; % constant term of electric and magnetic field equations

n =500 ; % total time

% u=zeros(1,size); % initially, E at all points is taken zero
u_n=zeros(size);    %constant time next state of wave
u_p=zeros(size);    %constant time previous state of wave
u = zeros(size);    %constant time present state of wave

t0=15;   % t0 of Gaussian source 
tp=5;   % tp of Gaussian source

for k=1:n

    for i=2:size-1
    for j=2:size-1      
        u_n(i,j)= 2*u_n(i,j)-u_p(i,j)+(cons^2)*( u(i+1,j)+u(i-1,j)-4*u(i,j)+u(i,j+1)+u(i,j-1) );
    end
    end
u_p=u;   % after this iteration present state becomes previous state
u=u_n;   % next step becomes present state

u(size/2,size/2)=exp(-((k-t0)/tp)^2);  % gaussian source position selected at the centre of the matrix
%u(size/2,size/2)=sin(2*pi*0.03*i);
imagesc(u)
A(k)=getframe;
end

【问题讨论】:

请勿重复发布。请关闭您的其他问题! 【参考方案1】:

我猜变量dx 是相关的。但你永远不会使用它。看下一段代码

dx=0.001;        % spatial increment

dt=dx/(c0);   % time increment

cons=c0*dt/dx; % constant term of electric and magnetic field equations

你很快就会意识到cons=1 总是!因此,您永远不会使用空间增量。

如果我将 cons 随机更改为 0.5,我会得到这个很棒的 gif:

写得好!

【讨论】:

以上是关于使用 FDM 的 Matlab 2D 波动方程的主要内容,如果未能解决你的问题,请参考以下文章

波动方程

数理方程:波动方程解法

FDM, FVM, FEM

波动方程水面模拟(简版)

给定边界条件时,Mathematica 不求解波动方程

怎么用matlab解方程啊?