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
相关产品推荐
相关产品推荐

