sympy求解隐函数报错'ImmutableDenseNDimArray'无as_independent属性如何修复
错误产生根源
- 你直接把二维numpy数组
X、Y传入了sympy的符号求解函数solve,sympy的符号运算体系不兼容numpy多维数组结构,内部处理表达式时尝试调用只有sympy对象才有的as_independent方法,numpy数组没有该方法,因此触发AttributeError。 - 补充:你要解的
x + 2y + z + e^(2z) = 0是超越方程,sympy本身也无法求出z的解析表达式,即便传入单值数值也拿不到可用解,这条路从逻辑上就走不通。
修复方案
改用数值求根方案,通过scipy的单变量求根函数逐点计算每个(x,y)对应的z值:
- 先将隐函数改写为求根形式:
f(z) = x + 2*y + z + np.exp(2*z) = 0,该函数对z单调递增(导数恒大于0),每个(x,y)对应唯一实根,不需要处理多解问题。 - 用
np.vectorize包装求根逻辑,适配numpy数组的批量输入。
完整可运行代码如下:
import numpy as np from scipy import optimize import matplotlib.pyplot as plt fig = plt.figure(2, figsize=(10, 7)) ax = fig.gca(projection='3d') x = np.linspace(-1, 1, num=20) y = np.linspace(-1, 1, num=20) X, Y = np.meshgrid(x, y) # 定义求根用的隐函数 def root_func(z, x, y): return x + 2 * y + z + np.exp(2 * z) # 定义单(x,y)点求z的函数 def get_z(x, y): res = optimize.root_scalar(root_func, args=(x, y), bracket=[-10, 10]) return res.root # 适配批量numpy数组输入 vec_get_z = np.vectorize(get_z) Z = vec_get_z(X, Y) # 绘图 surf = ax.plot_wireframe(X, Y, Z, linewidth=1, antialiased=False, color='b') plt.xlabel('x') plt.ylabel('y') ax.set_zlabel('z') plt.title('Implicit surface') plt.show()
内容的提问来源于stack exchange,提问作者mel
相关产品推荐
相关产品推荐

