我正在尝试绘制二维函数(特别是二维Laplace解)。我定义了函数,当输入特定数字时它返回正确的值,但是当我尝试遍历值数组(下面的x,y)时,它仍然仅返回一个数字。我尝试使用x和y的随机函数(例如f(x,y)= x ^ 2 + y ^ 2),它为我提供了一个值数组。
def V_func(x,y):
a = 5
b = 4
Vo = 4
n = np.arange(1,100,2)
sum_list = []
for indx in range(len(n)):
sum_term = (1/n[indx])*(np.cosh(n[indx]*np.pi*x/a))/(np.cosh(n[indx]*np.pi*b/a))*np.sin(n[indx]*np.pi*y/a)
sum_list = np.append(sum_list,sum_term)
summation = np.sum(sum_list)
V = 4*Vo/np.pi * summation
return V
x = np.linspace(-4,4,50)
y = np.linspace(0,5,50)
V_func(x,y)
出局:53.633709914177224
答案 0 :(得分:0)
尝试一下:
def V_func(x,y):
a = 5
b = 4
Vo = 4
n = np.arange(1,100,2)
# sum_list = []
sum_list = np.zeros(50)
for indx in range(len(n)):
sum_term = (1/n[indx])*(np.cosh(n[indx]*np.pi*x/a))/(np.cosh(n[indx]*np.pi*b/a))*np.sin(n[indx]*np.pi*y/a)
# sum_list = np.append(sum_list,sum_term)
sum_list += sum_term
# summation = np.sum(sum_list)
# V = 4*Vo/np.pi * summation
V = 4*Vo/np.pi * sum_list
return V
答案 1 :(得分:0)
定义一对数组:
In [6]: x = np.arange(3); y = np.arange(10,13)
In [7]: x,y
Out[7]: (array([0, 1, 2]), array([10, 11, 12]))
尝试2的简单功能
In [8]: x + y
Out[8]: array([10, 12, 14])
由于它们的大小相同,因此可以按元素进行求和(或以其他方式组合)。结果的形状与2个输入的形状相同。
现在尝试“广播”。 x[:,None]
的形状为(3,1)
In [9]: x[:,None] + y
Out[9]:
array([[10, 11, 12],
[11, 12, 13],
[12, 13, 14]])
结果为(3,3),重整的x
中的前3个,y
中的第二个。
我可以用meshgrid
生成一对数组:
In [10]: I,J = np.meshgrid(x,y,sparse=True, indexing='ij')
In [11]: I
Out[11]:
array([[0],
[1],
[2]])
In [12]: J
Out[12]: array([[10, 11, 12]])
In [13]: I + J
Out[13]:
array([[10, 11, 12],
[11, 12, 13],
[12, 13, 14]])
请注意meshgrid
中添加的参数。这就是我们从一对一维数组生成二维值的方法。
现在看看sum
的作用。在函数中使用它时:
In [14]: np.sum(I + J)
Out[14]: 108
结果是一个标量。参见文档。如果指定axis
,则会得到一个数组。
In [15]: np.sum(I + J, axis=0)
Out[15]: array([33, 36, 39])
如果您赋予V_func
正确的x
和y
,则sum_list
可能是3d数组。无轴的sum
将其缩减为标量。
在这样的代码中,您需要跟踪数组形状。如果需要,包括测试打印;不要仅仅承担任何事情;测试一下。注意尺寸在通过各种操作时如何增长和缩小。