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

Python中如何正确求解带参数的非线性方程组

代码错误原因

你写的代码无法运行,核心问题有三个:

  • 方程定义错误:原方程右侧为参数a、c,你代码里错误写成了a**2和c**2,和待求解的方程组不匹配
  • fsolve调用缺失必填参数:fsolve要求必须传入迭代初始值x0作为迭代起点,你的代码没有提供该参数
  • 参数传递逻辑错误:代码中直接写args=data但data变量从未被定义,参数没有正确传入方程函数
可运行实现

数值求解版本(fsolve实现)

按照你要求的「传入a、b、c返回解」的需求,修正后的可运行代码如下:

from scipy.optimize import fsolve

def solve_circle_intersection(a, b, c, init_guess=(1, 1)):
    def equations(var):
        x, y = var
        eq1 = x**2 + y**2 - a
        eq2 = (x - b)**2 + y**2 - c
        return [eq1, eq2]
    x, y = fsolve(equations, x0=init_guess)
    return x, y

# 调用示例,比如取a=25, b=3, c=16
x, y = solve_circle_intersection(a=25, b=3, c=16)
print(f"x = {x:.4f}, y = {y:.4f}")

使用注意

  • 这个方程组本质是求两个圆的交点,根据参数不同可能存在0个(无交点)、1个(相切)、2个(相交)实数解。fsolve是数值迭代算法,只会返回和初始猜测值收敛到的一个解,如果要得到另一个y符号相反的解,可以修改init_guess参数,比如传入(1, -1)即可得到负y的解。
  • 如果参数设置不合理导致两圆无交点,fsolve会返回迭代不收敛的错误结果。

解析解版本(更稳定无迭代)

这个方程组结构非常简单,消元后可以直接得到解析解,不需要数值迭代,结果更稳定,还能直接返回所有解:

import numpy as np

def solve_circle_intersection_analytic(a, b, c):
    # 两式相减消去y²,直接计算x
    x = (a - c + b**2) / (2 * b)
    y_square = a - x**2
    # 浮点数容错判断
    if y_square < -1e-8:
        raise ValueError("当前参数下两圆无实数交点")
    y_square = max(y_square, 0)
    y = np.sqrt(y_square)
    # 返回两个交点,相切时两个解y值相同
    return (x, y), (x, -y)

# 调用示例
sol1, sol2 = solve_circle_intersection_analytic(a=25, b=3, c=16)
print(f"解1: x={sol1[0]:.4f}, y={sol1[1]:.4f}")
print(f"解2: x={sol2[0]:.4f}, y={sol2[1]:.4f}")

运行上述示例会得到两个解(3,4)和(3,-4),和数学推导结果完全一致。

内容的提问来源于stack exchange,提问作者stefanR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 03:51:19