# 首发于我的博客 The North.

新年第一篇,搞起.

这回写一个好久之前想做,一直搁着没做的东西—— Python 解方程(其实是放假回家,趁着家里电脑重装 LOL 的时间过来写一篇). 咱这回用三种不同的方法,来应对平常碰到的简单方程.

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 求解非线性方程组

先看官方文档的介绍:

scipy.optimize.fsolve(func, x0, args=(), fprime=None, full_output=0, col_deriv=0, xtol=1.49012e-08, maxfev=0, band=None, epsfcn=None, factor=100, diag=None)[source]

一般来说,我们只需要用到 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]

另外,@Wayne Shi 的这篇 使用 Python 解数学方程,就重点讲述了 SymPy 解线性方程组的方法,所以我也就不再赘述了。

其实 SymPy 能干的太多了,有兴趣的可以看一看 GitHub上的 Quick examples.

最后

安利自己一波,求一份关于 程序化投资 方向的寒假实习.

这是我的简历(划掉),欢迎骚扰.

python解复杂方程_Python 解方程的三种方法相关推荐

  1. python如何删除代码_Python列表删除的三种方法代码分享

    1.使用del语句删除元素 >>> i1 = ["a",'b','c','d'] >>> del i1[0] >>> prin ...

  2. python怎么数据归一化_python数据归一化及三种方法详解

    数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可 ...

  3. python包导入方式_python导包的几种方法(自定义包的生成以及导入详解)

    python 导入数据包的几种方法 1.直接导入整个数据包:improt 数据包 2.导入数据包中的某一个函数: from 数据包 improt 函数(当函数这一项为 * 时为导入整个数据包) 3. ...

  4. 正圆锥体空间方程_数值模拟偏微分方程的三种方法:FDM、FEM及FVM

    偏微分方程数值模拟常用的方法主要有三种:有限差分方法(FDM).有限元方法(FEM).有限体积方法(FVM),本文将对这三种方法进行简单的介绍和比较. 一.有限差分方法 有限差分方法(Finite D ...

  5. python线性方程组求解_python求解方程组的三种方法

    python求解方程组的三种方法: Numpy求解方程组x + 2y = 3 4x + 5y = 6 当然我们可以手动写出解析解,然后写一个函数来求解,这实际上只是用 Python 来单纯做" ...

  6. python怎么复制字符串_python字符串复制的几种方法

    >>> list1 = [1,2] >>> id(list1) 50081032 >>> list2 = list1.copy() >> ...

  7. centos 卸载软件_一篇看懂!详解-Linux系统中安装软件的三种方法

    Linux系统中安装软件的三种方法 注:本文主要以CentOS为例介绍常用的安装方式,其他版本linux在文章底部 Linux系统中怎么安装软件,首先说一下应用程序与系统命令的区别: 1.文件位置 系 ...

  8. python提供了方法用于读取文本文件内容_python提供了哪三种方法用于读取文本文件的内容?...

    三种方法分别是:"read()"."readline()"."readlines()"."read()"是一次性读取文件 ...

  9. python urllib下载文件怎么停止_python下载文件的三种方法

    Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件.此外Python还提供了另外一种方法 ...

  10. Python课堂:判定IP地址合法性的三种方法

    IP IP合法性校验是开发中非常常用的,看起来很简单的判断,作用确很大,写起来比较容易出错,今天我们来总结一下,看一下3种常用的IP地址合法性校验的方法. IPv4的ip地址格式:(1~255).(0 ...

最新文章

  1. 求整型数组所有子串的和中的最大值
  2. python操作系统-Python操作系统
  3. Transformer Family
  4. 关于使用 ./ 执行sh文件报错-bash: ./startup.sh: /bin/sh^M: bad interpreter: No such file or directory
  5. boost::gil模块数字扩展中的 resize_view() 示例
  6. Tensorflow实战系列之五:
  7. 计算机刷帖知识点,09计算机408分(沙滩帖)
  8. java与ios_JAVA和IOS区别是什么?
  9. payara 创建 集群_Apache Payara:让我们加密
  10. docker swarm 实战
  11. Helm 3 完整教程(十):Helm 函数讲解(4)加密函数、编码和解码函数
  12. nrf52832开发配置文件小记
  13. 认识计算机重点知识,认识计算机教案
  14. 初探iOS项目使用MVP模式
  15. Cytoscape.js style属性详解
  16. 基于leaflet-velocity的二维动态风场展示
  17. 2021年全球及中国旅游产业发展现状及趋势分析[图]
  18. java计算机毕业设计网上宠物商城管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  19. java将“2018年4月8日”转换成正常日期:2018年04月08日
  20. 量子计算机可以发明时光机,俄科学家发明全球第一台时光机,可让微小粒子向过去移动1秒钟...

热门文章

  1. 关于ping以及TTL的分析
  2. torch.cat 关于 dim=0,dim=1 测试
  3. Java NIO由浅入深(作者原创)
  4. 【手机远程连接电脑】【TeamViewer版】
  5. ubuntu安装Linux集成服务,Hyper-v R2中安装ubuntu后,安装集成环境。--梦飞翔的地方(梦翔天空)...
  6. C/C++语言入门(精讲系列)——Hello World 你好,世界
  7. JS正则表达式可以为空但不可以输入特殊字符可以输入逗号(自用)
  8. 漏电监测在景观喷泉、喷水池的应用-安科瑞耿敏花
  9. SHEEL-远程调用执行命令模板
  10. 天敏VC4000调试