python 以及将数组传递给函数的问题

问题描述 投票:0回答:2

我需要求解一些常微分方程 $ rac{d y}{d x} = f(x) = x^2 ln(x)$ 并继续在限制 0 之间创建数组 xpt。 <= xpt <= 2. Because I have to be careful at xpt = 0, I have defined the function as follows

定义 f(x):

if x <= 1.e-6:
    return 0.
else:
    return np.square(x)*np.log(x)

我的调用程序读取

Npt = 200

xpt = np.linspace(0.,2.,Npt)

fpt = np.zeros(Npt)

但是,当我拨打电话时 fpt = f(xpt) 我收到错误了

“ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()”

我可以通过引入 for 循环来解决这个问题,写

对于范围内的IP(Npt):

fpt[ip] = f(xpt[ip])

但这似乎是一种黑客行为并且令人不满意。

我尝试查看使用 a,any() 的建议并将该函数重新定义为

def Newf(x):

if ((x <= 1.e-6).all()):
    return 0.
else:
    return np.square(x*np.log(x))

但这似乎将 f(0.) 给出为 nan。

如有任何有关如何进行的帮助,我们深表感谢。

python arrays numerical-methods
2个回答
0
投票

试试这个代码

import numpy as np

def f(x):
    return np.where(x <= 1.e-6, 0., np.square(x) * np.log(x))

Npt = 200
xpt = np.linspace(0., 2., Npt)
fpt = f(xpt)

print(fpt)

np.where(condition, value_if_true, value_if_false) 按元素应用条件。如果条件为 true,则使用 value_if_true,否则使用 value_if_false。


0
投票

您按原样编写了函数 f,它获取单个值,同时向其传递一个数组。我认为您还误解了 .all() 和 .any() 函数在 np 数组(以及 python 中的其他可迭代对象)上的使用。 如果数组中的任何元素的值可以被视为“True”,.any() 函数将返回 True,如果是数字,它会检查数组中是否存在不为 0 的元素。 .all() 函数以类似的方式起作用,只是它确保所有项目的值都可以解释为“True”。

一个可能的解决方案是更改函数来处理数组并返回修改后的数组。不确定您稍后打算在代码中做什么,但我假设您想查看 f(xpt) 是否全为零。在这种情况下,这应该有效:

import numpy as np


def f(array):
    result = np.zeros_like(array)
    mask = array > 1.e-6
    result[mask] = np.square(array[mask]) * np.log(array[mask])
    return result


def main():
    Npt = 200
    xpt = np.linspace(0., 2., Npt)
    print(not any(f(xpt)))


if __name__ == '__main__':
    main()
© www.soinside.com 2019 - 2024. All rights reserved.