0

我正在尝试运行这个简单的扩散案例(我知道它通常并不理想),并且我在获得固体内部方面做得很好,但在外边缘需要一些帮助。

global M
size=100
M=zeros(size,size);
M(25,25)=50;
for diffusive_steps=1:500
oldM=M;
newM=zeros(size,size);
for i=2:size-1;
    for j=2:size-1;
    %we're considering the ij-th pixel
    pixel_conc=oldM(i,j);
    newM(i,j+1)=newM(i,j+1)+pixel_conc/4;
    newM(i,j-1)=newM(i,j-1)+pixel_conc/4;
    newM(i+1,j)=newM(i+1,j)+pixel_conc/4;
    newM(i-1,j)=newM(i-1,j)+pixel_conc/4;
    end
end
M=newM;

end

这是一段非常简单的代码,我知道这一点。我还不太擅长使用 Octave(贸易化学家),所以我很感激任何帮助!

4

2 回答 2

0

如果您担心模拟的边界,可以用 NaN 值填充矩阵,然后在模拟完成后移除边界。NaN 代表非数字,通常用于表示空白数据。有许多 MATLAB 函数以有用的方式使用这些值。

例如找到有空格的数组的平均值:

nanmean([0 nan 5 nan 10])

ans = 

   5

在您的情况下,我将首先在您的 M 矩阵中添加 NaN 的边界。我使用 'n' 而不是 'size',因为 size 是 MATLAB 中的一个重要函数,并且将其用作变量会导致混淆错误。

n=100;

blankM=zeros(n+2,n+2);
blankM([1,end],:) = nan;
blankM(:, [1,end]) = nan;

现在我们可以定义“M”。请注意,第一列和第一行将是 NaN,因此我们需要添加一个偏移量 (25+1):

M = blankM;
M(26,26)=50; 

运行模拟,

m = size(blankM, 1);
n = size(blankM, 2);
for diffusive_steps=1:500
    oldM = M;
    newM = blankM;
    for i=2:m-1;
        for j=2:n-1;
            pixel_conc=oldM(i,j);
            newM(i,j+1)=newM(i,j+1)+pixel_conc/4;
            newM(i,j-1)=newM(i,j-1)+pixel_conc/4;
            newM(i+1,j)=newM(i+1,j)+pixel_conc/4;
            newM(i-1,j)=newM(i-1,j)+pixel_conc/4;
        end
    end
    M=newM;
end

然后提取感兴趣的区域

finalResult = M(2:end-1, 2:end-1);
于 2013-05-24T06:52:27.293 回答
0

您可能会做出的一个简单更改是在感兴趣的域周围添加鬼细胞或光晕的边界。size我没有滥用名称,而是使用了一个名为sz. 代替:

M=zeros(sz,sz)

M=zeros(sz+2,sz+2)

然后计算你在这个增强矩阵内部的扩散,即在细胞上(2:sz+1,2:sz+1)。在考虑结果时,丢弃或忽略光环。

更简单的方法是简单地采用您已经拥有的东西并忽略现有矩阵中位于 N、S、E、W 边缘的单元格。

这种技术广泛用于诸如和类似的问题,并且避免了编写代码来处理没有完整邻居的单元格上的计算的需要。为晕细胞的内容设置适当的值是一个与问题相关的问题,0并不总是正确的值。

于 2013-05-24T06:46:40.193 回答