背景:

如何使用python求解多元多次方程组或者非线性方程组。

原创内容,转载注明出处!请勿用于商业用途!

(上篇用python拟合2019nCov感染人数的文章被不少博主转载了,发的比较早,不少博主在文章基础上添加新内容也新发了新的更新后的预测,或者加入一些新的模块。博文链接如下:)

目录

一、多元多次方程

1.1 定义

我们常见的方程组有一元一次方程组,比如x+3=5这种,很简单很好解。

二元一次方程组,即方程组中有两个未知数,未知数的最高次数为1.

二元二次方程组:方程组中有两个未知数,未知数的最高次数为2.。此类方程组均有公式解法或者成形的解法。

但是面临多元多次方程组,解法错综复杂,是数学家们研究的内容。为了更好的解决此类问题,我们可以用python来实现。

1.2 例子

多元多次方程组例如下面这种,三元二次方程组:

下面这种,二元二次方程组。

第二个方程组实在比较复杂,因此需要借助python。

二、python求解工具包

python求解方程组的工具包较多。例如:

numpy:numpy.linalg.solve 可以直接求解线性方程组,numpy是python非常常用的包,解的方程也较为初级。

scipy:from scipy.optimize import fsolve,可以求解非线性方程组,使用较为方便,但是解集并不完备,可能漏掉一下解(后文会给个例子)scipy可以用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化,相对较初级易用

sympy:此工具包功能相对强大,支持符号计算、高精度计算、解方程、微积分、组合数学、离散数学、几何学、概率与统计、物理学等方面的功能。github地址:

https://github.com/sympy/sympy

sage,不支持位运算,z3约束求解器,等其他工具包,本文不详述,感兴趣的可以查找相应的内容。

本文详细讲述scipy以及sympy求解多次方程的方法。

三、scipy方法

3.1 使用scipy的fsolve求解

我们只将求解方程的部分。

用fsolve相对初级,也相对简单易操作,代码较为简单,只用将方程的表达式写出运行即可。fsolve近似看作用最小二乘法求解。不够很强大,很多情况下解集不完备或者无法解出。

例如对于

,首先要定义相应的函数:

def solve_function(unsolved_value):

x,y,z=unsolved_value[0],unsolved_value[1],unsolved_value[2]

return [

x**2+y**2-10,

y**2+z**2-34,

x**2+z**2-26,

]

求解函数三个公式都为0时候的解,中括号内为初值[0, 0, 0]

solved=fsolve(solve_function,[0, 0, 0])

全部代码:

#!/usr/bin/python

# -*- coding: UTF-8 -*-

"""

python解方程

"""

from scipy.optimize import fsolve

def solve_function(unsolved_value):

x,y,z=unsolved_value[0],unsolved_value[1],unsolved_value[2]

return [

x**2+y**2-10,

y**2+z**2-34,

x**2+z**2-26,

]

solved=fsolve(solve_function,[0, 0, 0])

print(solved)

print("Program done!")

"""

运行结果:

[-1. 3. 5.]

Program done!

"""

看出运行结果来看,此结果并非完备解集。因为x,y,z都是可正可负。例如1或者-1,3或者-3,5或者-5,但是此工具包只能解出一个解。

3.2 非完备解

显而易见,x**2-9=0的解为3或者-3

def solve_function(unsolved_value):

x=unsolved_value[0]

return [

x**2-9,

]

solved=fsolve(solve_function,[0])

但是程序只能得出一个结果3,但是得不到-3

3.3 非线性方程的解

最简单的sin(x)=0.5,则x可能为π/6或者 5π/6

#!/usr/bin/python

# -*- coding: UTF-8 -*-

"""

python解方程

"""

from scipy.optimize import fsolve

from math import sin,cos

def solve_function(unsolved_value):

x=unsolved_value[0]

return [

sin(x)-0.5

]

solved=fsolve(solve_function,[3.14])

print(solved)

solved=fsolve(solve_function,[0])

print(solved)

print("Program done!")

运行结果为:

[2.61799388]

[0.52359878]

Program done!

可以解出π/6或者 5π/6,中括号内为初始迭代的值。

3.4 无法求解

部分较难情况无法求解

#!/usr/bin/python

# -*- coding: UTF-8 -*-

"""

python解方程

"""

from scipy.optimize import fsolve

def solve_function(unsolved_value):

x,y=unsolved_value[0],unsolved_value[1]

return [

x*x+2*x*y,

2*x*y-2*y*y

]

solved=fsolve(solve_function,[6, -3])

print(solved)

print("Program done!")

无法求解会给出报错,和用最小二乘法迭代得到明显错误的解。

[1.64526700e-115 1.33665018e-115]

A:\python\python\lib\site-packages\scipy\optimize\minpack.py:162: RuntimeWarning: The number of calls to function has reached maxfev = 600.

Program done!

warnings.warn(msg, RuntimeWarning)

四、sympy工具包求解

没安装可以在teiminal中pip install sympy,此工具包涉及支持符号计算、高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散 数学、几何学、概率与统计、物理学等方面的功能。功能较为强大,解方程组时性能也较好。

4.1 二元一次方程组

较为简单,

from sympy import *

# 二元一次方程

x = Symbol('x')

y = Symbol('y')

solved_value=solve([2*x+y-1, x-2*y], [x, y])

print(solved_value)

此方法较为简单,但是相应的自变量应当写成符号的形式,x=Symbol('x')

求解后有分数解:

{x: 2/5, y: 1/5}

Program done!

4.2 多解

多解情况与复数解

例如,多个解的情况,sympy可以很好的进行求解

x = Symbol('x')

solved_value=solve([x**2-9], [x])

print(solved_value)

输出结果:

[(-3,), (3,)]

4.3 复数解

复数解也可以很好解出:

# 复数解

solved_value = solve([x ** 2 + 9], [x])

print(solved_value)

solved_value = solve([x ** 4 - 9], [x])

print(solved_value)

"""

运行结果:

[(-3*I,), (3*I,)]

[(-sqrt(3),), (sqrt(3),), (-sqrt(3)*I,), (sqrt(3)*I,)]

"""

复数解也能较好解出

4.4 非线性求解

比如三角函数:

程序均能较好解出

# 非线性解

solved_value = solve([sin(x) - 0.5], [x])

print(solved_value)

solved_value = solve([sin(x) - 1], [x])

print(solved_value)

"""

[(0.523598775598299,), (2.61799387799149,)]

[(pi/2,)]

"""

4.5 较为复杂的二元二次方程

此题较难,无论人来算,很难算出,用scipy工具包也迭代不出解。但是sympy强大的功能可以很好的解出此方程。

# 二元二次方程组

x = Symbol('x')

y= Symbol('y')

solved_value=solve([x**2+2*x*y-6,2*x*y-2*y**2+3], [x,y])

print(solved_value)

有四组实数解:

[(-(-3 + sqrt(13))*sqrt(sqrt(13)/2 + 2), -sqrt(sqrt(13)/2 + 2)),

((-3 + sqrt(13))*sqrt(sqrt(13)/2 + 2), sqrt(sqrt(13)/2 + 2)),

(-sqrt(2 - sqrt(13)/2)*(-sqrt(13) - 3), -sqrt(2 - sqrt(13)/2)),

(sqrt(2 - sqrt(13)/2)*(-sqrt(13) - 3), sqrt(2 - sqrt(13)/2))]

复杂的问题终于解出,有四组实数解!

五、全部代码

#!/usr/bin/python

# -*- coding: UTF-8 -*-

"""

python解方程

created by xingxinagrui on 2020.2.24

"""

from scipy.optimize import fsolve

from math import sin,cos

from sympy import *

# 1-4 scipy

# 5-7 sympy

part=7

if part==1:

# 求解非线性方程组

def solve_function(unsolved_value):

x=unsolved_value[0]

return [

sin(x)-0.5

]

solved=fsolve(solve_function,[3.14])

print(solved)

solved=fsolve(solve_function,[0])

print(solved)

if part==2:

# 求解三元二次方程组

def solve_function(unsolved_value):

x, y, z = unsolved_value[0], unsolved_value[1], unsolved_value[2]

return [

x ** 2 + y ** 2 - 10,

y ** 2 + z ** 2 - 34,

x ** 2 + z ** 2 - 26,

]

solved = fsolve(solve_function, [0, 0, 0])

print(solved)

if part==3:

#解的非完备性

def solve_function(unsolved_value):

x = unsolved_value[0]

return [

x ** 2 - 9,

]

solved = fsolve(solve_function, [0])

print(solved)

if part == 4:

# 较难无法求解

def solve_function(unsolved_value):

x, y = unsolved_value[0], unsolved_value[1]

return [

x * x + 2 * x * y,

2 * x * y - 2 * y * y

]

solved = fsolve(solve_function, [6, -3])

print(solved)

if part == 5:

# 二元一次方程

x = Symbol('x')

y = Symbol('y')

solved_value=solve([2*x+y-1, x-2*y], [x, y])

print(solved_value)

if part == 6:

# 多解情况

x = Symbol('x')

solved_value=solve([x**2-9], [x])

print(solved_value)

# 复数解

solved_value = solve([x ** 2 + 9], [x])

print(solved_value)

solved_value = solve([x ** 4 - 9], [x])

print(solved_value)

# 非线性解

solved_value = solve([sin(x) - 0.5], [x])

print(solved_value)

solved_value = solve([sin(x) - 1], [x])

print(solved_value)

if part == 7:

# 二元二次方程组

x = Symbol('x')

y= Symbol('y')

solved_value=solve([x**2+2*x*y-6,2*x*y-2*y**2+3], [x,y])

print(solved_value)

print("Program done!")

博主其他文章:

python解多元多次方程组_Python求解多重或非线性方程,python,多元,多次,方程组,线性方程组...相关推荐

  1. python解三元方程组_python求解/求解三元方程组

    当我试图用python3中的以下代码求解一个由三个方程组成的方程组时,我总是出错:import sympy from sympy import Symbol, solve, nsolve x = Sy ...

  2. python解压版怎么安装_python 解压版 zip file 安装

    python 解压版 zip file 安装 Python Releases for Windows 找到最新稳定版本的 "Download Windows x86-64 embeddabl ...

  3. python元组和列表的联系_Python | 一文看懂Python列表、元组和字符串操作

    好文推荐,转自CSDN,原作星辰StarDust 序列序列是具有索引和切片能力的集合. 列表.元组和字符串具有通过索引访问某个具体的值,或通过切片返回一段切片的能力. 列表.元组.字符串都属于序列 1 ...

  4. python解奥数题_【新手】小白用python解小学奥数第五集

    前言 因为工作的关系,长期教小学数学奥数,最近接触到python,学到了while:for 语句这里,于是就有了这个想法:用python解奥数题 1. 订立制作目标目标: 打印题目 输入逻辑 输出答案 ...

  5. python核心编程第三版_Python之父:自学python,这3本书能节约你一大半时间编程...

    今天给大家推荐三本书,有两本是属于一个系列,即<Python核心编程>第二版和第三版,一本讲基础和一本讲进阶,非常适合Python的初学者和有一定基础的学习者.还有一本书适合所有想学Pyt ...

  6. python简单代码需要写多久_python基本语法?初学Python要多久才能入门?

    展开全部 首先给你分2113享Python学习入门中常用的语5261法知识 1.变量.常量,就4102是值不能被改变的量,比如16535.10等数字或者一个字符串的文本.与常量相对应的就是变量,就是值 ...

  7. python解非线性规划问题讲析_python中线性规划中的单纯形法、scipy库与非线性规划求解问题...

    单纯形法.scipy库与非线性规划求解问题 单纯形法的基本定义 大M法求解线性规划的原理 excel求解 Python调用optimize包和scipy求解线性规划 Python编程实现单纯形法 对比 ...

  8. python解压加密zip文件_Python:解压缩前检测一个zip文件否为加密,两种算法。

    前一篇文章介绍了如何用python自动解压缩加密的zip文件, 但是有一个问题,在服务器端脚本在解加密zip文件之前,需要检测其是否是加密文件,若是,则询问密码,结合密码解压缩:如果不是,则则直接解压 ...

  9. python 解压文件 已存在_python解压zip和rar文件问题以及解决方法

    写此文的目的是记录自己的学习过程,一些经过,遇到问题以及解决问题的方法,存放在这里,方便自己以后复习以及自己的一些总结,如果此文对你有帮助,请随时联系我微信:wangzhixiong1533 ◆ ◆ ...

最新文章

  1. pandas使用argmax函数返回给定series对象中最大值(max、maximum)的行索引实战
  2. centos 并发请求数_Linux Shell多进程并发以及并发数控制
  3. 蓝桥杯 ADV-150算法提高 周期字串
  4. 霍尼韦尔扫描枪设置手动方法
  5. steam的游戏id怎么查?
  6. LC-3指令集 指令/状态码介绍
  7. Java1-35 Java学习笔记
  8. AD18如何制作logo
  9. 2021年PHP最新面试题(一)
  10. python3 url解析 urllib.parse.urlparse 库简介
  11. 最年轻市长背后的选任悖
  12. 数量乘以单价的公式计算机,“excel公式大全详解“单价乘以数量 然后累加的公式 EXCEL...
  13. Arduino UNO使用Syn6288进行简单开发案例
  14. 微信小程序 首行缩进、 去掉/取消首行缩进
  15. 这八道经典指针笔试题你都会做嘛?
  16. HDFS Truncate文件截断
  17. idea快速删除空行
  18. 超级计算机主要原理,超级计算机原理与操作(1)
  19. 编程如何修改Revit族类型名称
  20. Idea中Maven控制的多模块项目运行不到最新的代码,写的代码不生效问题解决方法记录。

热门文章

  1. 第一次作业:幻想科技
  2. 这十个Python语法,让你的代码更为精炼高效!
  3. java根据ip地址获取城市地域信息
  4. python install tensorflow 国内源-清华源安装
  5. 工程伦理--4.1 解决伦理困境的一般步骤
  6. 解决Office 打开Excel 空白问题
  7. Windows 2003访问https失败
  8. excel交叉表的数据清理
  9. SpringCloud中Feign进行服务调用 java.io.IOException: too many bytes written 问题解决
  10. 阶梯下降法,房价问题