如何用python解方程?

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

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

 

1

前言

    

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

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

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

2

scipy非线性方程组求解

    

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

程序代码:

 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 及以上数字,有惊喜好礼哦~
推荐阅读

题图:pexels,CC0 授权。

  • 30
    点赞
  • 185
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值