评估以列主顺序存储的函数

我正在尝试在离散点评估函数并按列主顺序存储,如下所示:

https://img2.mukewang.com/65129ca700019ccc03830870.jpg

https://img2.mukewang.com/65129caf000132cd06500515.jpg

import numpy as np; 


N = 3 ##

n = N * N

h = 1 / (N + 1) # step size

h2 = h**2  # 



deltaX = np.zeros(N)

deltaY = np.zeros(N);


def Function(x, y):

    output = -20. * np.pi * np.sin(2 * np.pi * x) * sin(4 * np.pi * y)

    return output

    

## Equally spaced delta: 

for i in range(1, N + 1): 

    deltaX[i - 1] = i * h; 

    deltaY[i - 1] = i * h; 


### Lexicographic Row order  ###


### Evaluation of function at deltaX and deltaY 


feval = np.zeros((n, 1))

我该如何评估该函数的离散化?


慕的地10843
浏览 74回答 1
1回答

森林海

好消息:您的函数正确使用 numpy 运算,因此完全矢量化。这意味着您可以在输入数组的每个元素处对其进行评估。输入的形状不必完全匹配。他们只需一起广播即可。这意味着只有非单一维度需要匹配。因此,首先创建适当的输入数组。Numpy 提供了无需循环即可优雅地完成此操作的工具:N = 3h = 1 / (N + 1)delta_x = np.arange(1., N + 1.) * hdelta_y = np.linspace(h, N * h, N)[:, None]我故意使用两种不同的方式来创建坐标数组,作为示例。在实践中,您需要使用这两种方法之一。索引[:, None]变成delta_y列向量。None引入了新的单例轴。有许多其他方法可以做同样的事情,例如 `delta_y = ....reshape(-1, 1)。并阅读我链接到的文档以及我使用的所有功能。现在您在 y 方向上有一列,在 x 方向上有一行,您可以Function这样调用val = Function(delta_x, delta_y)将二维矩阵排列成一维数组的操作val称为拆散。默认情况下,它使用 numpy 在内存中使用的默认行优先顺序。该顺序也称为“C”顺序。另一种安排是按列主顺序解释数组,就像 Matlab 所做的那样。这称为 Fortran 顺序。它将需要数据的副本,因为这不是元素在内存中的布局方式。以 Fortran 顺序进行解释的一种方法:feval = val.ravel(order='F')另一种方法是转置并使用 C 顺序:feval = val.T.ravel()最后两行可以合并,因此最终得到 3 行:delta_x = h * np.arange(1., N + 1.)delta_y = h * np.arange(1., N + 1.)[:, None]feval = Function(delta_x, delta_y).ravel(order='F')你可以把它写成一句俏话,但这就是推动它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python