如何用python解方程?

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

 如何用python解方程?_第1张图片

1

前言

    

       在科学计算中,我们经常会遇到数值计算,可能遇到高数,线性代数等,在实际的解题中可能会比较麻烦,还会容易出错,这里就对于python在科学计算中,做一简单介绍,涉及非齐次方程组,多元一次方程组,符号运算,因式分解等。

        在使用python进行线性方程组求解的时候,需要您去安装相应的程序包,scipy或者sympy,其官方文档分别为https://www.scipy.org/、https://docs.sympy.org/latest/index.html。

        这里只做抛砖引玉之举,更多可参考官方指南。

2

scipy非线性方程组求解

    

        求解线性方程组比较简单,只需要用到一个函数(scipy.linalg.solve)就可以了。比如我们要求以下方程的解,这是一个非齐次线性方程组:

如何用python解方程?_第2张图片

程序代码:

 1import numpy as np
 2from scipy.linalg import solve
 3#输出系数矩阵
 4a=np.array([[3,1,-2],[1,-1,4],[2,0,3]])
 5#值
 6b=np.array([5,-2,2.5])
 7#计算
 8x=solve(a,b)
 9#打印结果
10print(x)

结果

1[0.5 4.5 0.5]
2[Finished in 1.2s]

3

sympy 数学方程求解


        SymPy是比较强大的,可以做到符号的化简,求值等。SymPy是符号数学的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。SymPy完全是用Python写的,并不需要外部的库。

        可以做到先设置变量,然后打印不需要设置值的功能,例如:在我们日常书写中print(x+y)是会报错的,然而使用了如下就不会报错了:

1from sympy import *
2x,y= symbols('x,y')
3print(x + y)

3.1

方程表示

        公式与代码之间转换:

  • 加号 +

  • 减号 -

  • 除号 /

  • 乘号 *

  • 指数 **

  • 对数 log()

  • e的指数次幂 exp()

3.2

简单的方程求解

         这里以一元一次方程为例,对2x-4=0进行求解,具体实现如下:

 代码:

1from sympy import *
2x= symbols('x')
3print(solve(x*2-4,x))

结果:

1[2]
2[Finished in 1.3s]

        需要说明的是:solve:第一个参数为要解的方程,要求右端等于0,第二个参数为要解的未知数。还有一些 其他的参数,想了解更多的可以去看官方文档。

3.3

二元一次方程方程的求解

        以下介绍如何求解二元一次方程,具体如下:

代码:

1from sympy import *
2x,y= symbols('x,y')
3print(solve([2*x-y-3,3*x+y-7],[x,y]))

结果:

1{x: 2, y: 1}
2[Finished in 1.2s]

3.4

一元二次方程的求解

        以下介绍如何求解一个一元二次方程,具体如下:

代码:

1from sympy import *
2x= symbols('x')
3print(solve(x**2+2*x+1,x))

结果:

1[-1]
2[Finished in 1.0s]

3.5

多项式化简并计算

        以下介绍如何解多项式:x*x+a*a=0,然后带入a=3,求得的结果,具体如下:

代码:

1from sympy import *
2x,a= symbols('x,a')
3#计算多项式的结果,表达式方式的结果
4result_or=solve(x**2+a**2,x)
5print(result_or)
6#带入数值,这里设置a=3
7for temp in result_or:
8    print(temp.subs([(a,3)]))

结果:

1[-I*a, I*a]
2-3*I
33*I
4[Finished in 1.2s]

4

拓展 使用sympy 计算


        以下是求解nature cubic spline中在三点情况下的曲线方程过程,计算比较简单。

 1from sympy import *
 2
 3a1,b1,c1,d1,a2,b2,c2,d2=symbols('a1,b1,c1,d1,a2,b2,c2,d2')
 4x0,x1,x2,y0,y1,y2=symbols('x0,x1,x2,y0,y1,y2')
 5result=solve([a1+b1*x0+c1*x0*x0+d1*x0*x0*x0-y0,
 6    a1+b1*x1+c1*x1*x1+d1*x1*x1*x1-y1,
 7    a2+b2*x1+c2*x1*x1+d2*x1*x1*x1-y1,
 8    a2+b2*x2+c2*x2*x2+d2*x2*x2*x2-y2,
 9    b1+2*c1*x1+3*d1*x1*x1-b2-2*c2*x1-3*d2*x1*x1,
10    c1+3*d1*x1-c2-3*d2*x1,
11    c1+3*d1*x0,
12    c2+3*d2*x2],[a1,b1,c1,d1,a2,b2,c2,d2])
13#设置参数
14cs=[(x0,6),(x1,9),(x2,12),(y0,0),(y1,3),(y2,0)]
15
16# print(result[a1])
17# print(result[b1])
18# print(result[c1])
19# print(result[d1])
20# print(result[a2])
21# print(result[b2])
22# print(result[c2])
23# print(result[d2])
24
25a1=result[a1].subs(cs)
26b1=result[b1].subs(cs)
27c1=result[c1].subs(cs)
28d1=result[d1].subs(cs)
29a2=result[a2].subs(cs)
30b2=result[b2].subs(cs)
31c2=result[c2].subs(cs)
32d2=result[d2].subs(cs)
33print(a1)
34print(b1)
35print(c1)
36print(d1)
37print(a2)
38print(b2)
39print(c2)
40print(d2)
回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版
回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版
回复关键词「m」,立即获取Python精选优质文章合集
回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~
推荐阅读
  • 2019年,大家都是怎么用 Pandas 的?

  • 一篇文章读懂 Python 多线程

  • 效率翻倍!再也不用手动改测试接口的参数了

  • 一行代码弄懂数据,pandas最佳搭档就是ta了

  • 让你赚钱更省力的 10 个开源项目!

题图:pexels,CC0 授权。

你可能感兴趣的:(python,数学建模,js,数据可视化,scipy)