欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python 解方程

程序员文章站 2022-04-03 23:19:07
...

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

sympy

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

线性方程

solve the equation 3x2+2x=0. The answer is x1=0,x2=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
相关标签: 方程