使用scipy.fsolve绘制隐函数z(x,y)时遇报错求助
问题解决:使用scipy.fsolve绘制隐函数z(x,y)
错误原因分析
第一版代码报错
_minpack.error: Result from function call is not a proper array of floats:X和Y是二维数组,直接传入fsolve的lambda函数时,函数返回二维数组,但fsolve要求目标函数输出维度和输入z的维度一致(此处z为标量初始值0),维度不匹配引发报错。
修改后代码报错
AttributeError: 'float' object has no attribute 'ndim':- 虽将
X、Y展平为一维数组,但fsolve会把目标函数的一维输出视为方程组求解,而非逐个处理每个(x,y)对应的独立方程,导致内部类型处理出错。
- 虽将
正确实现代码
核心思路:将单个(x,y)求解z的标量函数通过np.vectorize向量化,使其支持数组输入:
import numpy as np from scipy.optimize import fsolve import matplotlib.pyplot as plt # 定义单个(x,y)求解z的函数 def solve_z(x, y): def target(z): return x + y + z + np.sin(z) z_sol = fsolve(target, x0=0) return z_sol[0] # 向量化函数,适配数组输入 vec_solve_z = np.vectorize(solve_z) # 生成网格数据 x = np.linspace(-1, 1, 50) y = np.linspace(-1, 1, 40) X, Y = np.meshgrid(x, y) # 求解所有网格点对应的z值 Z = vec_solve_z(X, Y) # 绘制3D网格图 fig = plt.figure() ax = plt.axes(projection='3d') ax.plot_wireframe(X, Y, Z, color='red') plt.show()
关键说明
np.vectorize会自动遍历输入数组的每个元素,调用标量版本的solve_z,确保每个(x,y)对独立求解对应z值。- 单独定义
target函数,避免lambda向量化时的变量捕获问题,同时让逻辑更清晰。 - 保证
fsolve每次处理标量方程,返回的标量z值可被正确收集为数组。
内容的提问来源于stack exchange,提问作者flowerlilypad
相关产品推荐
相关产品推荐

