4

我将首先声明,是的,这是作业(我在 stackoverflow 上的第一个作业问题!)。但我不想让你帮我解决,我只是想要一些指导!

有问题的等式是这样的:有问题的系列

我被告知取 N = 50, phi1 = 300, phi2 = 400, 0<=x<=1 和 0<=y<=1,并让 x 和 y 成为 100 个等距点的向量,包括终点。

所以我做的第一件事就是设置这些变量,并使用 x = linspace(0,1) 和 y = linspace(0,1) 来制作正确的向量。

问题是编写一个名为 potential.m 的 MATLAB 脚本文件,该文件计算 phi(x,y) 并使用内置函数contourf绘制与 x 和 y 的填充等高线图(有关示例,请参见 MATLAB 中的帮助命令)。确保正确标记图形。(提示:域的顶部和底部应该在 400 度左右,而左侧和右侧应该在 300 度左右)。

但是,以前,我使用 x 或 y 作为常数来计算 phi。如果两者都是变量,我应该如何计算它?我是否保持 x 稳定,同时遍历 y 向量中的每个数字,将其分配给矩阵,在一次又一次地遍历 y 的每个值后将 x 递增到其向量中的下一个数字?然后做同样的过程,但是慢慢增加 y ?

如果是这样,我一直在使用一个循环,每次循环遍历所有 100 个值时都会递增到下一行。如果我这样做,我最终会得到一个有 200 行和 100 列的巨大矩阵。我将如何在 linspace 函数中使用它?

如果这是正确的,这就是我找到矩阵的方式:

clear
clc
format compact
x = linspace(0,1);
y = linspace(0,1);
N = 50;
phi1 = 300;
phi2 = 400;
phi = 0;
sum = 0;
for j = 1:100
    for i = 1:100
        for n = 1:N
            sum = sum + ((2/(n*pi))*(((phi2-phi1)*(cos(n*pi)-1))/((exp(n*pi))-(exp(-n*pi))))*((1-(exp(-n*pi)))*(exp(n*pi*y(i)))+((exp(n*pi))-1)*(exp(-n*pi*y(i))))*sin(n*pi*x(j)));
        end
        phi(j,i) = phi1 - sum;
    end
end
for j = 1:100
    for i = 1:100
        for n = 1:N
            sum = sum + ((2/(n*pi))*(((phi2-phi1)*(cos(n*pi)-1))/((exp(n*pi))-(exp(-n*pi))))*((1-(exp(-n*pi)))*(exp(n*pi*y(j)))+((exp(n*pi))-1)*(exp(-n*pi*y(j))))*sin(n*pi*x(i)));
        end
        phi(j+100,i) = phi1 - sum;
    end
end

这是contourf的定义。我想我必须使用 contourf(X,Y,Z):

contourf(X,Y,Z)、contourf(X,Y,Z,n) 和 contourf(X,Y,Z,v) 使用 X 和 Y 绘制 Z 的填充等高线图以确定 x 轴和 y 轴限制。当 X 和 Y 是矩阵时,它们的大小必须与 Z 相同,并且必须单调递增。

这是新代码:

N = 50;
phi1 = 300;
phi2 = 400;
[x, y, n] = meshgrid(linspace(0,1),linspace(0,1),1:N)
f = phi1-((2./(n.*pi)).*(((phi2-phi1).*(cos(n.*pi)-1))./((exp(n.*pi))-(exp(-n.*pi)))).*((1-(exp(-1.*n.*pi))).*(exp(n.*pi.*y))+((exp(n.*pi))-1).*(exp(-1.*n.*pi.*y))).*sin(n.*pi.*x));
g = sum(f,3);
[x1,y1] = meshgrid(linspace(0,1),linspace(0,1));
contourf(x1,y1,g)
4

2 回答 2

3

您的代码需要这么长时间来计算phi矩阵的原因是您没有预先分配数组。发生大小错误是因为phi不是 100x100。但是,与其修复这些东西,还有一个更好的方法......

MATLAB 是一个 MATrix LABoratory,所以这种类型的方程很容易使用矩阵运算来计算。提示:

  1. x不是循环遍历and的值、行或列,而是y构造矩阵来表示所有可能的输入组合。检查网格网格

  2. 您仍然需要一个循环来对 n = 1:N 求和。但是对于 n 的每个值,您可以一次计算所有 x 和 y 的方程(使用提示 1 中的矩阵)。完成这项工作的关键是使用逐个元素的运算符,例如.*and ./

像这样使用矩阵运算是 Matlab 方式。学习并爱上它。(并且在使用大多数其他没有它们的语言时会感到沮丧。)

祝你的家庭作业好运!

于 2013-01-25T04:32:55.917 回答
3

向量化代码。例如,您可以使用以下方式编写f(x,y,n)

 [x y n] = meshgrid(-1:0.1:1,-1:0.1:1,1:10);
 f=exp(x.^2-y.^2).*n ;

f是一个 3D 矩阵,现在刚好sum在正确的维度上......

 g=sum(f,3);

为了使用contourf,我们将只使用 2D 部分x,y

 [x1 y1] = meshgrid(-1:0.1:1,-1:0.1:1);    
 contourf(x1,y1,g)

在此处输入图像描述

于 2013-01-25T04:57:41.443 回答