我将首先声明,是的,这是作业(我在 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)