丁祥欢
学习笔记:用Python解方程或符号运算
2020-11-5 21:45
阅读:9420

在某些领域,Python加上特定的库,可以代替Matlab的部分功能,做为简单的Matlab替代品,比如之前演示过的拟合曲线功能。这里学习一下用Python进行解数学方程:

安装SymPy库(符号Sym,Python缩写Py):  pip install sympy  完毕就可以用了。

用小朋友的作业为例:

f1.png


题目当然比较简单,先用Matlab演示一下怎么算,再对比一下Python的做法:

>> syms x y A B; %定义四个变量x,y, A, B
>> A=3*x^2 + 3*y^2 -5 * x *y;  B=2*x*y - 3*y^2 + 4*x^2; %将A B两式输入,这个要保证正确。
>> 2*B - A %求解2B-A
ans =
5*x^2 + 9*x*y - 9*y^2
>> % 上面即是2B-A的值
>> % 再计算第2问,求2B-A的值。根据同类项的定义知道|x-2|=1, y=2. x有3和1两种解,y就是2

>> x=3; y=2; % 第1种情况,给x,y输入值
>> f=@(x,y)5*x^2 +9*x*y -9*y^2; %定义一个无名称的函数f,函数即上述结果

>> f(x,y)  %求值
ans
=   63
>> x=1; y=2; %调整x y的值
>> f(x,y)  % 再计算
ans =
  -13

matlab的公式看起来不太直观,但还是挺好用的。


再来看Python的用法

import sympy
x,y=sympy.symbols('x y')  #定义变量
A=3*x**2 + 3*y**2 -5*x*y #输入公式
B=2*x*y -3*y**2 +4*x**2
fx=2*B-A  #定义函数
fx   #显示函数结果
5*x**2 + 9*x*y - 9*y**2
fx.evalf(subs={x:3, y:2})  #使用fx的evalf函数来求值,输入的参数用字典形式赋给subs参数
63.0000000000000
fx.evalf(subs={x:1,y:2})  #类似上面,但x值 有变化了。
-13.0000000000000


再来一道题目,如下:

整理一批图书,如果由一个人单独做要花60小时。 现先由一部分人用1小时整理,随后增加15人和他们一起又做了2小时,恰好完成整理工作。假设每个人的工作效率相同,那么先安排整理的人员有多少人?

解:假设先安排整理的人员为x人,则整体的工作量为60(人·小时).  列出方程为:

f2.png

用Python来解:

import sympy as sy
x=sy.symbols('x')
f=x*1 + (x+15)*2-60  #方程要变形成右边为零的形式,所以右边的项移到左边为减60, 然后省略=0
answer=sy.solve([f],[x]) #输入方程式列表(可能存在多个方程)和未知数列表(也可能存在多个未知数)。
print(answer) #将answer打印出来即可。
{x: 10}

结果就是 x=10

再来一道 三元一次方程组:

f3.png

用Python来解的代码是

x,y,z = sy.symbols('x y z') #定义变量
f1=x +2*y +3*z -10          #输入方程,其实直接在列表中输入也可以,这样更简洁一点
f2=3*x -y + 2*z -9
f3=5*x +3*y -4*z -17
answer=sy.solve([f1, f2, f3],[x,y,z]) #将方程代入,变量代入,求解
print(answer)                #输出结果
{x: 3, y: 2, z: 1}

很显然,sympy库远不是展示的这么简单的功能,不多说。以下是本文的Markdown文件,顺便吐槽一下:科学网的公式编辑与代码高亮的功能还是差了点,用起来不太方便。

用Python解方程或符号运算.rar

转载本文请联系原作者获取授权,同时请注明本文来自丁祥欢科学网博客。

链接地址:https://wap.sciencenet.cn/blog-1213210-1257232.html?mobile=1

收藏

分享到:

当前推荐数:0
推荐到博客首页
网友评论0 条评论
确定删除指定的回复吗?
确定删除本博文吗?