You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用scipy.fsolve绘制隐函数z(x,y)时遇报错求助

问题解决:使用scipy.fsolve绘制隐函数z(x,y)

错误原因分析

  1. 第一版代码报错_minpack.error: Result from function call is not a proper array of floats:

    • X和Y是二维数组,直接传入fsolve的lambda函数时,函数返回二维数组,但fsolve要求目标函数输出维度和输入z的维度一致(此处z为标量初始值0),维度不匹配引发报错。
  2. 修改后代码报错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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 23:00:12