与曲面图和矩阵之间的轴差异混淆。 (试图解决泊松方程)

时间:2012-12-10 16:32:50

标签: matlab

我尝试按照本教程:Numerical solutions to the discrete poisson equation并添加边界条件,但我无法使轴正确。然后我用一些变量进行了攻击,似乎已经开始工作了,但我并不是100%肯定。

以下是我要解决的问题:

u_xx + u_yy = f(x,y), 0 <= x <= 1, 0 <= y <= 1.

u(x,y)=lower(x), if y=0
u(x,y)=upper(x), if y=1
u(x,y)=left(y), if x=0
u(x,y)=right(y), if x=1

解算器功能如下:(担心的地方标有%WARNING%):

function [ hor_padded ] = poisson_solver( f, upper, lower, left, right ,m, n)
%m, n - Number of points (same in x and y direction)

x_a=0;
x_b=1;
y_a=0;
y_b=1;

dx = (x_b-x_a)/m; %dx=dy

x=linspace(x_a,x_b,m);
y=linspace(y_a,y_b,n);

g=zeros(m,n);

for i=1:n,
    for j=1:m,
        %WARNING 1% 
        g(j,i)=-f(x(i),y(j))*dx*dx;

        if j==2
           g(j,i)=g(j,i)+lower(x(i));
        end
        if j==n-1
           g(j,i)=g(j,i)+upper(x(i));
        end
        if i==2
           g(j,i)=g(j,i)+left(y(j));
        end
        if i==n-1
           g(j,i)=g(j,i)+right(y(j));
        end
    end
end

b = reshape(g(2:m-1, 2:n-1),(m-2)*(n-2),1);

A = gallery('poisson',m-2);

U = A\b;

u = reshape(U,m-2,n-2);

upper_part=upper(x(2:m-1)); 
lower_part=lower(x(2:m-1)); 
left_part = left(y');
right_part = right(y');

%WARNING 2%
ver_padded = vertcat(lower_part, u, upper_part);
hor_padded = horzcat(left_part, ver_padded, right_part);

end
  1. 警告1)Matlab似乎在矩阵内混合x和y轴。 (如下所述:Axis labeling question)。所以我在for循环中改变了X和Y方向。这是对的吗?
  2. 警告2)我在开头有反过来的upper_part和lower_part,但是结果图中的边界没有达到。我检查了变量,尝试了另一种方式,它开始工作。这是对的吗?
  3. 我的测试程序在这里:

    clear;
    
    m = 100;
    n = 100;
    
    x_a=0;
    x_b=1;
    y_a=0;
    y_b=1;
    
    e=exp(1);
    f=@(x,y)(e*x+e*y); 
    
    %Boundary conditions
    upper = @(x) (x);
    lower = @(x) (3-x);
    left = @(y) (3-3*y);
    right = @(y) (2-y);
    
    u = poisson_solver(f, upper, lower, left, right, m, n);
    
    x=linspace(x_a,x_b,m);
    y=linspace(y_a,y_b,n);
    
    surf(x,y,u);
    xlabel('x');
    ylabel('y');
    

    另一个测试用例:(其他一切与上面的例子相同):

    upper = @(x) (exp(x));
    lower = @(x) (cos(x*2*pi));
    left = @(y) (cos(y*2*pi));
    right = @(y) (exp(y));
    

    名称“upper”,“lower”,“left”和“right”是指结果图,而不是求解器函数中矩阵u中的相应位置。

1 个答案:

答案 0 :(得分:1)

  

警告1)Matlab似乎在矩阵内混合x和y轴。 (如此处所述:轴标记问题)。所以我在for循环中改变了X和Y方向。这是对的吗?

是的,第一个矩阵索引是行索引,第二个索引是列索引:

[ (1,1)  (1,2)  . . .   (1,n);
  (2,1)  (2,2)  . . .   (2,n);
    :      :    .         :
    :      :      .       :
    :      :        .     :
  (m,1)  (m,2)  . . .   (m,n)];
  

警告2)我在开始时反过来使用了upper_part和lower_part,但是结果图中的边界没有达到。我检查了变量,尝试了另一种方式,它开始工作。这是对的吗?

如果将矩阵定义为xy-plane,则必须坚持索引的定义。正如您在我的索引示例中所看到的,'origin'((1,1))位于topleft,'y-axis'指向'向下'。所以考虑到这一点,你的上下变化是正确的。

在旁注中,您可以用不同的方式定义所有内容,它只是以您定义的方式排列和存储的一堆数字!