基于matlab的圆盘形区域有限差分Poisson-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

在我的研究中,我必须使用有限差分法为圆盘形区域上的泊松方程编写一个PDE解算器。
我已经通过了实验。我的代码中有一个问题我无法修复。函数
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