python 解方程

本文介绍使用Sympy与Scipy两个Python库进行方程求解的方法。Sympy适用于符号计算,能高效解决线性和非线性方程;Scipy则通过迭代法提供数值解,适合解决复杂的多元方程组。文章提供了具体的代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我用到的有两个库. sympy 与 scipy.

sympy

Symbolic Computation,符号计算.
一个符号计算库. anaconda自带. 解方程的功能比 scipy 强大.

线性方程

solve the equation 3x2+2x=0 − 3 x 2 + 2 x = 0 . The answer is x1=0,x2=2/3 x 1 = 0 , x 2 = 2 / 3 .

from sympy import *
x=symbols('x')  # indicate x is an symbol
eq=Eq(-3*x**2+2*x,0) # type the equation
print(solve(eq,x))  # [0, 2/3]

非线性方程

def get_point_of_contact(O: Point, A: Point, r: float)->str:
    """
    过圆外一点A, 求圆O的切点
    :param O: 圆心
    :param A: 圆外一点
    :param r: 圆的半径
    :return: 切点坐标
    """
    from sympy import symbols,nonlinsolve

    x,y=symbols('x y')  # indicate x is an symbol
    # 二元二次方程组:
    # * 切线与垂线向量乘法
    # * 圆的方程代入
    result=nonlinsolve([(A.x - x) * (x - O.x) + (A.y - y) * (y - O.y),
            (x - O.x) * (x - O.x) + (y - O.y) * (y - O.y) - r * r],[x,y])
    return result
print(get_point_of_contact(Point(0, 0), Point(2, 0), 1))
"""{(1/2, -sqrt(3)/2), (1/2, sqrt(3)/2)}"""

scipy

见参考[3]. 使用迭代法求数值解.
可以解多元多次方程, 给出方程组的同时, 必须也要给一个方程的根的初始迭代点. 所以求解的结果有两种:

  1. 没有结果
    因为迭代情况不理想 .
  2. 返回一个结果
    即便有多组解, 也只返回一个结果.

待弄懂

sympy比scipy强大, 耗时情况 如何?

参考

  1. git上的Quick-examples
  2. sympy.org 官网文档
  3. 官方文档 scipy.optimize.fsolve
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值