二维函数不返回值数组?

时间:2018-11-09 02:19:50

标签: python arrays numpy

我正在尝试绘制二维函数(特别是二维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

2 个答案:

答案 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正确的xy,则sum_list可能是3d数组。无轴的sum将其缩减为标量。

在这样的代码中,您需要跟踪数组形状。如果需要,包括测试打印;不要仅仅承担任何事情;测试一下。注意尺寸在通过各种操作时如何增长和缩小。