硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化学习资料的朋友,可以戳这里获取
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
先看官方文档的介绍:
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 本质上是最小二乘法来逼近真实结果.
例如求解一个:
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.
SymPy的官方教程:
https://github.com/sympy/sympy/wiki/Quick-examples
https://docs.sympy.org/latest/tutorial/index.html
已剪辑自: https://blog.csdn.net/starter_____/article/details/81989835
SymPy是符号数学的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。
In [1]:from sympy import *
In [2]:x = Symbol('x')
In [3]:y = Symbol('y')123
expand( )展开方程
In [8]: ((x+y)**2).expand()
Out[8]: x**2 + 2*x*y + y**212
facrot( )折叠方程
In [13]: factor(x**2 + 2*x*y + y**2)
Out[13]: (x + y)**212
apart( )分离整式
In [14]: together(1 + 2/(x - 1))
Out[14]: (x + 1)/(x - 1)12
together( )合并整式
In [10]: together(1/x+1/y+1/z)
Out[10]: (x*y + x*z + y*z)/(x*y*z)12
simplify( )普通的化简
In [15]: simplify((x**3 + x**2 - x - 1)/(x**2 + 2*x + 1))
Out[15]: x - 112
trigsimp( )三角化简
In [18]: trigsimp(sin(x)/cos(x))
Out[18]: tan(x)12
powsimp( )指数化简
In [21]: powsimp(x**a*x**b)
Out[21]: x**(a + b)12
第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数
一元一次方程
In [7]:solve(x * 3 - 6, x)
[2]12
二元一次方程
In [8]: solve([2 * x - y - 3, 3 * x + y - 7],[x, y])
Out[8]: {x: 2, y: 1}12
dir=’+’表示求解右极限,dir=’-‘表示求解左极限
In [10]: limit(1/x,x,oo,dir='+')
Out[10]: 0
In [11]: limit(1/x,x,oo,dir='-')
Out[11]: 01234
不定积分
In [12]: integrate(sin(x),x)
Out[12]: -cos(x)12
定积分
In [13]: integrate(sin(x),(x,0,pi/2))
Out[13]: 112
In [14]: diff(x**3,x)
Out[14]: 3*x**2
In [15]: diff(x**3,x,2)
Out[15]: 6*x12345
以 y′=2xy 为例
In [17]: f =Function('f')
In [18]: dsolve(diff(f(x),x) - 2*f(x)*x,f(x))
Out[18]: Eq(f(x), C1*exp(x**2))123
In [19]:x1,x2,x3 = symbols('x1 x2 x3')
In [20]:a11,a12,a13,a22,a23,a33 = symbols('a11 a12 a13 a22 a23 a33')
In [21]:m = Matrix([[x1, x2, x3]])
In [22]:n = Matrix([[a11, a12, a13], [a12, a22, a23], [a13, a23, a33]])
In [23]:v = Matrix([[x1], [x2], [x3]])
In [24]:f = m * n * v
In [25]:f[0].subs({x1:1, x2:1, x3:1})
Out[26]:Matrix([[x1*(a11*x1 + a12*x2 + a13*x3) + x2*(a12*x1 + a22*x2 + a23*x3) + x3*(a13*x1 + a23*x2 + a33*x3)]])
Out[27]:a11 + 2*a12 + 2*a13 + a22 + 2*a23 + a33
1234567891011
已剪辑自: https://www.cnblogs.com/zyg123/p/10549354.html
解多元一次方程可以使用solve(),在sympy里,等式是用Eq()来表示,
例如:2x=4 表示为:Eq(x*2, 4)
"""
解下列二元一次方程
2x-y=3
3x+y=7
"""
# 导入模块
from sympy import *
# 将变量符号化
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
# 解一元一次方程
expr1 = x*2-4
r1 = solve(expr1, x)
r1_eq = solve(Eq(x*2, 4), x)
print("r1:", r1)
print("r1_eq:", r1_eq)
# 解二元一次方程
expr2 = [2*x-y-3, 3*x+y-7]
r2 = solve(expr2, [x, y])
print("r1:", r2)
# 解三元一次方程
f1 = x+y+z-2
f2 = 2*x-y+z+1
f3 = x+2*y+2*z-3
r3 = solve([f1, f2, f3], [x, y, z])
print("r3:", r3)
在sympy中,解线性方程组有三种形式:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化学习资料的朋友,可以戳这里获取
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!