• 技术文章 >后端开发 >Python教程

    python如何解方程的三种方法

    爱喝马黛茶的安东尼爱喝马黛茶的安东尼2019-06-14 18:09:10原创18630
    python求解方程组的三种方法:

    相关推荐:《python视频

    Numpy求解方程组

    x + 2y = 3
    4x + 5y = 6

    当然我们可以手动写出解析解,然后写一个函数来求解,这实际上只是用 Python 来单纯做“数值计算”. 但实际上,numpy.linalg.solve 可以直接求解线性方程组.

    一般地,我们设解线性方程组形如 Ax=b,其中 A 是系数矩阵,b 是一维(n 维也可以,这个下面会提到),x 是未知变量. 再拿上面地最简单的二元一次方程组为例,我们用 numpy.linalg.solve 可以这样写:

    In [1]: import numpy as np
      ...: A = np.mat('1,2; 4,5')    # 构造系数矩阵 A
      ...: b = np.mat('3,6').T       # 构造转置矩阵 b (这里必须为列向量)
      ...: r = np.linalg.solve(A,b)  # 调用 solve 函数求解
      ...: print r
      ...:
    Out[1]: [[-1.]
          [ 2.]]

    那么前面提到的“ n 维”情形是什么呢?实际上就是同时求解多组形式相同的二元一次方程组,例如我们想同时求解这样两组:

    x + 2y = 3
    4x + 5y = 6

    x + 2y = 7
    4x + 5y = 8

    就可以这样写:

    In [2]: import numpy as np
      ...: A = np.mat('1,2; 4,5')          # 构造系数矩阵 A
      ...: b = np.array([[3,6], [7,8]]).T  # 构造转置矩阵 b (这里必须为列向量),
      ...: 注意这里用的是 array
      ...: r = np.linalg.solve(A,b)        # 调用 solve 函数求解
      ...: print r
      ...:
    Out[2]: [[-1.         -6.33333333]
          [ 2.          6.66666667]]

    SciPy 求解非线性方程组

    一般来说,我们只需要用到 func 和 x0 就够了. func 是自己构造的函数,也就是需要求解的方程组的左端(右端为 0),而 x0 则是给定的初值.

    我们来看一个具体的例子,求解:

    x + 2y + 3z - 6 = 0
    5 * (x ** 2) + 6 * (y ** 2) + 7 * (z ** 2) - 18 = 0
    9 * (x ** 3) + 10 * (y ** 3) + 11 * (z ** 3) - 30 = 0

    就可以这么写:

    In [3]: from scipy.optimize import fsolve
      ...:
      ...: def func(i):
      ...:     x, y, z = i[0], i[1], i[2]
      ...:     return [
      ...:             x + 2 * y + 3 * z - 6,
      ...:             5 * (x ** 2) + 6 * (y ** 2) + 7 * (z ** 2) - 18,
      ...:             9 * (x ** 3) + 10 * (y ** 3) + 11 * (z ** 3) - 30
      ...:            ]
      ...:
      ...: r = fsolve(func,[0, 0, 0])
      ...: print r
      ...:
    Out[3]: [ 1.00000001  0.99999998  1.00000001]

    当然,SciPy 也可以用来求解线性方程组,这是因为 scipy.optimize.fsolve 本质上是最小二乘法来逼近真实结果.

    SymPy 求解方程组

    例如求解一个:

    x + 2 * (x ** 2) + 3 * (x ** 3) - 6 = 0

    直接就是:

    In [4]: from sympy import *
      ...: x = symbols('x')
      ...: solve(x + 2 * (x ** 2) + 3 * (x ** 3) - 6, x)
    Out[4]: [1, -5/6 - sqrt(47)*I/6, -5/6 + sqrt(47)*I/6]

    以上就是python如何解方程的三种方法的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:python 解方程
    上一篇:python就是爬虫吗 下一篇:python中list的方法有什么
    Web大前端开发直播班

    相关文章推荐

    • python模块的相关介绍• 一款对python初学者友好的编辑器• python爬虫时常用的库的相关介绍• python IDE修改背景颜色的教程

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网