我如何模拟二维球面波从一个点源
How do I simulate 2D spherical waves from a point source?
我试图通过使用欧拉积分对波动方程进行数值积分来模拟波动(直到我弄清楚这些问题,然后我将切换到龙格-库塔)。我使用浮点数数组作为网格。然后我通过改变网格在某一点上的值来制造一个扰动。现在,不是从这一点向四面八方辐射,波只向一个方向传播,向左上角,也就是向x和y递减,我的问题是如何让波向外辐射?
这是我的代码
void Wave::dudx(float *input,float *output) //calculate du/dx
{
for(int y=0;y<this->height;y++)
{
for(int x=0;x<this->width;x++)
{
output[x+y*this->width]=(this->getPoint((x+1)%this->width,y)-this->getPoint(x,y)); //getPoint returns the value of the grid at (x,y)
}
}
}
void Wave::dudy(float *input,float *output) //calculate du/dy
{
for(int x=0;x<this->width;x++)
{
for(int y=0;y<this->height;y++)
{
output[x+y*this->width]=(this->getPoint(x,(y+1)%this->height)-this->getPoint(x,y));
}
}
}
void Wave::simulate(float dt)
{
float c=6.0f;
//calculate the spatial derivatives
this->dudx(this->points,this->buffer);
this->dudx(this->buffer,this->d2udx2);
this->dudy(this->points,this->buffer);
this->dudy(this->buffer,this->d2udy2);
for(int y=0;y<this->height;y++)
{
for(int x=0;x<this->width;x++)
{
this->points[x+y*this->width]+=c*c*(this->d2udx2[x+y*this->width]+this->d2udy2[x+y*this->width])*dt*dt; //I know that I can calculate c*c and dt*dt once, but I want to make it clear what I'm doing.
}
}
}
只是为了让其他人因为同样的问题来这里。将正则网格上的拉普拉斯表达式转换为有限差分表达式的常用方法是:
∆u(x,y) -> idx2*[u(x+1,y) + u(x-1,y) - 2*u(x,y)] +
idy2*[u(x,y+1) + u(x,y-1) - 2*u(x,y)]
其中,idx2
和idy2
分别为x和y维格间距的平方反比。在两个维度的网格间距相同的情况下,简化为:
∆u(x,y) -> igs2*[u(x+1,y) + u(x-1,y) + u(x,y+1) + u(x,y-1) - 4*u(x,y)]
可以通过将其隐藏在其他系数(例如c
)中,通过改变它们的测量单位来去除乘法系数:
∆u(x,y) -> u(x+1,y) + u(x-1,y) + u(x,y+1) + u(x,y-1) - 4*u(x,y)
顺便说一下,不可能有二维球面波,因为球体是三维物体。二维波称为圆波
相关文章:
- 为什么一个二维阵列会导致赛段故障,而另一个则不会导致?
- 如何在Visual Studio C++中声明一个二维字符串数组?
- 使用 Win32 中的 HBITMAP 绘制一个二维数组,C++
- 创建一个二维向量阵列,遍历
- 在C++中将一个二维数组复制到其他未知大小的二维数组
- 是一个二维数组的名称,它在C++中的第一个元素的地址
- 一个二维动态阵列的C++剖分与比较
- 基于另一个二维向量对二维向量进行排序
- 如何设置二维数组一个二维返回
- 两个不同尺寸的硬编码阵列组成一个二维矢量
- 实例化一个二维向量,其中一组对作为单元值
- C++2d地图?就像一个二维数组
- 给定一个二维字符矩阵,我们必须检查给定的单词是否存在于其中
- 当您有一个二维数组(C++)时调用析构函数的正确方法是什么?
- 创建一个二维指针数组
- 从函数返回一个二维数组
- 当我尝试输出一个二维数组时,它输出了错误的数字
- 为什么我可以声明一个二维数组与两个维度大小的变量,但不是新的
- c++函数创建一个二维数组并返回一个指向该二维数组的指针
- 在c++中创建一个二维链表对象