python解多元多次⽅程组_Python求解多重或⾮线性⽅
达克宁栓剂
程,python,多元,多次,。。。
背景:
如何使⽤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地址:
sage,不⽀持位运算,z3约束求解器,等其他⼯具包,本⽂不详述,感兴趣的可以查找相应的内容。
本⽂详细讲述scipy以及sympy求解多次⽅程的⽅法。
三、scipy⽅法
3.1 使⽤scipy的fsolve求解
win10配置要求
我们只将求解⽅程的部分。
⽤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}10岁
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,)]