基于matlab的圆盘形区域有限差分Poisson-PDE求解器
在我的研究中,我必须使用有限差分法为圆盘形区域上的泊松方程编写一个PDE解算器。基于matlab的圆盘形区域有限差分Poisson-PDE求解器,matlab,solver,pde,poisson,Matlab,Solver,Pde,Poisson,在我的研究中,我必须使用有限差分法为圆盘形区域上的泊松方程编写一个PDE解算器。 我已经通过了实验。我的代码中有一个问题我无法修复。函数fun1与边值问题gun2在边界处不知何故振荡。当我使用fun2时,一切似乎都很好 这两个函数都在边界处使用gun2。有什么问题 函数z=fun1(x,y) r=sqrt(x.^2+y.^2); z=零(尺寸(x)); 如果(r(M+2)/2 sig=1; 其他的 sig=-1; 结束 X(i,j)=sig*1*cos(Phi(i,j)); Y(i,j)=s
我已经通过了实验。我的代码中有一个问题我无法修复。函数
fun1
与边值问题gun2
在边界处不知何故振荡。当我使用fun2
时,一切似乎都很好
这两个函数都在边界处使用gun2
。有什么问题
函数z=fun1(x,y)
r=sqrt(x.^2+y.^2);
z=零(尺寸(x));
如果(r<0.25)
z=-10^8*exp(1./(r.^2-1/16));
结束
结束
函数z=fun2(x,y)
z=100*sin(2*pi*x)。*sin(2*pi*y);
结束
函数z=gun2(x,y)
z=x.^2+y.^2;
结束
函数[u,A]=poisson2(funame,guname,M)
如果nargin<3
M=50;
结束
%网格生成
h=2/(M+1);
x=-1:h:1;
y=-1:h:1;
[X,Y]=网格网格(X,Y);
CI=((X.^2+Y.^2)<1);
%边界元
总和=零(大小(CI));
%超过邻居的总数
对于i=-1:1
Sum=Sum+circshift(CI[i,0])+circshift(CI[0,i]);
结束
%如果邻居的总和大于3->内部注释!
CI=(总和>3);
%埃尔斯边界
CB=(和<3&和=0);
总和=零(大小(CI));
%边界上相邻节点的求和。。。。
对于i=-1:1
Sum=Sum+circshift(CB[i,0])+circshift(CB[0,i]);
结束
%如果总和等于2->对角线边界
CB=CB+(总和=2&CB=0&CI=0);
%将X-Y坐标转换为极坐标
Phi=atan(Y./X);
%仅在边界处将φR转换回笛卡尔坐标
对于j=1:M+2
对于i=1:M+2
if(CB(i,j)~=0)
如果j>(M+2)/2
sig=1;
其他的
sig=-1;
结束
X(i,j)=sig*1*cos(Phi(i,j));
Y(i,j)=sig*1*sin(Phi(i,j));
结束
结束
结束
%对内部注释u1、u2、…、un进行编号
CI=CI.*重塑(总和(CI(:)),大小(CI));
%内部票据数量
Ni=nnz(CI);
f=零(Ni,1);
k=1;
A=石碳酸钙(镍,镍,5*镍);
%创建matix A!
对于j=2:M+1
对于i=2:M+1
if(CI(i,j)~=0)
hN=h;hS=h;hW=h;hE=h;
f(k)=fun(X(i,j),Y(i,j));
if(CB(i+1,j)~=0)
hN=abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k)=f(k)+枪(X(i,j),Y(i+1,j))*2/(hN^2+hN*h);
A(k,CI(i-1,j))=-2/(h^2+h*hN);
其他的
如果负y中的(CB(i-1,j)~=0)%
hS=abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k)=f(k)+枪(X(i,j),Y(i-1,j))*2/(hS^2+h*hS);
A(k,CI(i+1,j))=-2/(h^2+h*hS);
其他的
A(k,CI(i-1,j))=-1/h^2;
A(k,CI(i+1,j))=-1/h^2;
结束
结束
if(CB(i,j+1)~=0)
hE=abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k)=f(k)+枪(X(i,j+1),Y(i,j))*2/(hE^2+hE*h);
A(k,CI(i,j-1))=-2/(h^2+h*hE);
其他的
if(CB(i,j-1)~=0)
hW=abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k)=f(k)+枪(X(i,j-1),Y(i,j))*2/(hW^2+h*hW);
A(k,CI(i,j+1))=-2/(h^2+h*hW);
其他的
A(k,CI(i,j-1))=-1/h^2;
A(k,CI(i,j+1))=-1/h^2;
结束
结束
A(k,k)=(2/(hE*hW)+2/(hN*hS));
k=k+1;
结束
结束
结束
%求解线性系统
u=A\f;
U=零(M+2,M+2);
p=1;
%阿兰格酒店
对于j=1:M+2
对于i=1:M+2
if(CI(i,j)~=0)
U(i,j)=U(p);
p=p+1;
其他的
if(CB(i,j)~=0)
U(i,j)=枪(X(i,j),Y(i,j));
其他的
U(i,j)=NaN;
结束
结束
结束
结束
冲浪(X,Y,U);
结束
我暂时将此答案保持简短,但当问题包含更多信息时,可能会延长答案
我的第一个猜测是,你们看到的只是数字误差。从两个图的比例来看,第一个图中的峰值与第二个图中的信号相比相对较小。也许在第二种情况下也有类似的问题,只是因为信号大得多而看不见。您可以尝试增加节点数并观察结果
您应该总是期望在此类模拟中看到数值错误。这只是一个问题,试图让他们的规模尽可能小(或尽可能小的需要)。我现在保持这个答案简短,但可能会延长当问题包含更多的信息
我的第一个猜测是,你们看到的只是数字误差。从两个图的比例来看,第一个图中的峰值与第二个图中的信号相比相对较小。也许在第二种情况下也有类似的问题,只是因为信号大得多而看不见。您可以尝试增加节点数并观察结果
您应该总是期望在此类模拟中看到数值错误。这只是一个尽可能小(或尽可能小)的问题。与其在问题中加入一堆代码,不如对你要解决的问题给出一个高层次的解释(当然要定义泊松方程中使用的符号),以及解决过程的概述?您能否对您正在解决的问题(当然是定义您在泊松方程中使用的符号)进行高层次的解释,并概述解决过程,而不是在您的问题中添加一堆代码?
function z = fun1(x,y)
r = sqrt(x.^2+y.^2);
z = zeros(size(x));
if( r < 0.25)
z = -10^8*exp(1./(r.^2-1/16));
end
end
function z = fun2(x,y)
z = 100*sin(2*pi*x).*sin(2*pi*y);
end
function z = gun2(x,y)
z = x.^2+y.^2;
end
function [u,A] = poisson2(funame,guname,M)
if nargin < 3
M = 50;
end
%Mesh Grid Generation
h = 2/(M + 1);
x = -1:h:1;
y = -1:h:1;
[X,Y] = meshgrid(x,y);
CI = ((X.^2 +Y.^2) < 1);
%Boundary Elements
Sum= zeros(size(CI));
%Sum over the neighbours
for i = -1:1
Sum = Sum + circshift(CI,[i,0]) + circshift(CI,[0,i]) ;
end
%if sum of neighbours larger 3 -> inner note!
CI = (Sum > 3);
%else boundary
CB = (Sum < 3 & Sum ~= 0);
Sum= zeros(size(CI));
%Sum over the boundary neighbour nodes....
for i = -1:1
Sum = Sum + circshift(CB,[i,0]) + circshift(CB,[0,i]);
end
%If the sum is equal 2 -> Diagonal boundary
CB = CB + (Sum == 2 & CB == 0 & CI == 0);
%Converting X Y to polar coordinates
Phi = atan(Y./X);
%Converting Phi R back to cartesian coordinates, only at the boundarys
for j = 1:M+2
for i = 1:M+2
if (CB(i,j)~=0)
if j > (M+2)/2
sig = 1;
else
sig = -1;
end
X(i,j) = sig*1*cos(Phi(i,j));
Y(i,j) = sig*1*sin(Phi(i,j));
end
end
end
%Numberize the internal notes u1,u2,......,un
CI = CI.*reshape(cumsum(CI(:)),size(CI));
%Number of internal notes
Ni = nnz(CI);
f = zeros(Ni,1);
k = 1;
A = spalloc(Ni,Ni,5*Ni);
%Create matix A!
for j=2:M+1
for i =2:M+1
if(CI(i,j) ~= 0)
hN = h;hS = h; hW = h; hE = h;
f(k) = fun(X(i,j),Y(i,j));
if(CB(i+1,j) ~= 0)
hN = abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k) = f(k) + gun(X(i,j),Y(i+1,j))*2/(hN^2+hN*h);
A(k,CI(i-1,j)) = -2/(h^2+h*hN);
else
if(CB(i-1,j) ~= 0) %in negative y is a boundry
hS = abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k) = f(k) + gun(X(i,j),Y(i-1,j))*2/(hS^2+h*hS);
A(k,CI(i+1,j)) = -2/(h^2+h*hS);
else
A(k,CI(i-1,j)) = -1/h^2;
A(k,CI(i+1,j)) = -1/h^2;
end
end
if(CB(i,j+1) ~= 0)
hE = abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k) = f(k) + gun(X(i,j+1),Y(i,j))*2/(hE^2+hE*h);
A(k,CI(i,j-1)) = -2/(h^2+h*hE);
else
if(CB(i,j-1) ~= 0)
hW = abs(1-sqrt(X(i,j)^2+Y(i,j)^2));
f(k) = f(k) + gun(X(i,j-1),Y(i,j))*2/(hW^2+h*hW);
A(k,CI(i,j+1)) = -2/(h^2+h*hW);
else
A(k,CI(i,j-1)) = -1/h^2;
A(k,CI(i,j+1)) = -1/h^2;
end
end
A(k,k) = (2/(hE*hW)+2/(hN*hS));
k = k + 1;
end
end
end
%Solve linear system
u = A\f;
U = zeros(M+2,M+2);
p = 1;
%re-arange u
for j = 1:M+2
for i = 1:M+2
if ( CI(i,j) ~= 0)
U(i,j) = u(p);
p = p+1;
else
if ( CB(i,j) ~= 0)
U(i,j) = gun(X(i,j),Y(i,j));
else
U(i,j) = NaN;
end
end
end
end
surf(X,Y,U);
end