我需要求解一些常微分方程 $ 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。
如有任何有关如何进行的帮助,我们深表感谢。
试试这个代码
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。
您按原样编写了函数 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()