ホームページ  >  記事  >  バックエンド開発  >  Python での Sympy 代数シンボリック演算の概要

Python での Sympy 代数シンボリック演算の概要

不言
不言転載
2019-03-29 11:04:386902ブラウズ

この記事では、Python での Sympy 代数記号演算の概要を紹介します。これには特定の参考値があります。必要な友人は参照できます。お役に立てば幸いです。

私たちが中学、高校、大学と約 10 年間勉強してきた中で、数学は常に非常に大きな役割を果たしてきましたが、過去を振り返ると、多くの時間を費やしてきたことがわかります。インターネット上では、計算方法、計算スキル、筆記計算スキル、数式の記憶が数学を学ぶすべてになっているようです。これらの記憶やスキルは数年以内に忘れ去られますが、多くの人はその影を今でも覚えており、書面による計算や問題解決が AI、グラフィックス、データ分析などのソフトウェアに置き換えられました。では、学生時代の数学には何が残っているのでしょうか?

電卓と数学

数学電卓と言えば、私たちが目にする最も一般的な 4 つの演算は加算、減算、乗算、除算です。伝統的な筆算と暗算の計算。 4桁以上の加減乗除は、実は数学原理的には難しくありませんが、電卓に頼らず自分の計算能力(筆算や暗算)だけに頼ってしまうと、計算の精度は大幅に低下しますが、計算がさらに難しくなります。私たちの数学の使用は依然として非常に浅いレベルにとどまっています。

四則演算は非常に単純ですが、複数桁の演算の暗算は、私たちの人生において天才的な能力として分類されます。しかし、数学の応用は天才の専売特許ではなく、実用化され普及するものであるべきであり、電卓はすべてを変えました、これが電卓の魅力です。
電卓は、べき乗、平方根、指数、対数、三角関数などの科学演算も実行できます。この知識は中学生時代に紙とペンを使って計算することもできますが、使える知識は限られています。極端な一般的な単純な操作が複雑になると、ペンと紙を使って操作を実行する複雑なプロジェクトになります。したがって、 電卓は私たちを数学の応用に近づけることができます。
しかし、私たちが学生時代に学んだ数学はこれらにとどまらず、特に高度な数学 (微積分)、線形代数、確率と統計、その他の数学的知識が広く使用されています (私は後になって初めて知りました)。しかし、そのため計算は非常に複雑です。この知識をマスターしても、それを応用するのは簡単ではありません。微積分、線形代数、確率、統計などの計算機はありますか?

答えは「はい」です。コンピュータ代数システム (略して CAS) です。Python の

Sympy ライブラリ は、演算用の数学記号を使用した微積分、線形代数などもサポートしています。

電卓を使用すると、複雑な数学的問題解決そのものから真に抜け出して、数学の原理と応用の学習にエネルギーを費やすことができ、これが(仕事における)数学学習の意味です。
コンピュータ代数システム

Sympy は、数学記号に対する演算を実装し、それを使用して数式の記号導出と検証を実行し、数学記号を使用して導関数、極限、微積分、および方程式を処理できます。 、行列などは、

Computer Algebra System CAS に似た関数電卓のように単純です。CAS は通常、視覚化ソフトウェアですが、Wikipedia では Sympy も CAS として分類されています。

MathematicaMaximaMatlab (Symbolic Math Toolbox が必要)Maple## などのいくつかの有名な数学ソフトウェア# などはシンボリック演算を実行できます。前の記事では、Python と R および Matlab を比較しました。明らかに、指定されたシナリオでは Python には非常に明白な利点があるため、Sympy と Mathematica の比較を調査しました。数式を入力するとき、Sympy は実際に(Python にはこれを補う他のライブラリがあります) Sympy は基本的に Mathematica でできることは何でもできます。 つまり、専門的な数学 (数学、データ サイエンスなど) の分野では、Python は、最も強力なライブラリに直面しても、多くの強力なサードパーティ ライブラリを備えているため、非常に完全なエコロジー チェーンを形成しています。世界で最も強力なソフトウェアも同様です。

Python による数学の学習に関するこのコラムの次回号では、数学の学習をより簡単かつ鮮明にするための非常に実用的な数学ツールと数学教材をいくつか紹介します。

Sympy の記号演算

以前に数学を勉強し、コンピューター代数システム CAS について学んだことがある場合は、数学記号の演算に精通しているでしょう。しかし、以前にプログラマーだった場合は、少し馴染みがないかもしれませんが、とてもわかりやすいので、次に見てみましょう。

Sympy 関数と Math 関数の違い

まず、数値計算の処理における Sympy ライブラリと Python の組み込み Math 関数の違いを見てみましょう。コードを実行可能にするために、次のコードは Python3 の完全なコードに基づいています。

import sympy,math
print(math.sqrt(8))
print(sympy.sqrt(8))

実行後、結果は次のように表示されます:

2.8284271247461903
2*sqrt(2)

数学モジュールは浮動小数点値を直接解きますが、Sympy は数学記号を使用して結果を表現します。LaTex 構文と組み合わせると、次のことができます。 get 教科書で最もよく知られている $2\sqrt{2}$ を考えてみましょう。

数学記号と式

我们要对数学方程组、微积分等进行运算时,就会遇到变量比如x,y,z,f等的问题,也会遇到求导、积分等代数符号表达式,而Sympy就可以保留变量,计算有代数符号的表达式的。

from sympy import *
x = Symbol('x')
y = Symbol('y')
k, m, n = symbols('k m n')
print(3*x+y**3)

输出的结果为:3*x + y**3,转化为LaTex表示法之后结果为$3x+y^3$,输出的结果就带有x和y变量。Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号。

折叠与展开表达式

factor()函数可以折叠表达式,而expand()函数可以展开表达式,比如表达式:$x^4+xy+8x$,折叠之后应该是$x(x^3+y+8)$。我们来看具体的代码:

from sympy import *
x,y = symbols('x y')
expr=x**4+x*y+8*x
f_expr=factor(expr)
e_expr=expand(f_expr)
print(f_expr)
print(e_expr)

表达式的折叠与展开,对应的数学知识就是因式分解,相关的数学知识在人教版初二的教程里。用Python学习数学专栏的目的就是要Python与初高中、大学的数学学习结合起来,让数学变得更加简单生动。

表达式化简

simplify()函数可以对表达式进行化简。有一些表达式看起来会比较复杂,就拿人教版初二上的一道多项式的乘法为例,简化$(2x)^3(-5xy^2)$。

from sympy import *
x,y = symbols('x y')
expr=(2*x)**3*(-5*x*y**2)
s_expr=simplify(expr)
print(s_expr)

求解方程组

在人教版的数学教材里,我们初一上会接触一元一次方程组,初一下就会接触二元一次方程、三元一次方程组,在初三上会接触到一元二次方程,使用Sympy的solve()函数就能轻松解题。

解一元一次方程

我们来求解这个一元一次方程组。(题目来源于人教版七年级数学上)
$$6 \times x + 6 \times(x-2000)=150000$$

from sympy import *
x = Symbol('x')
print(solve(6*x + 6*(x-2000)-150000,x))

我们需要掌握Python的代码符号和数学符号之间的对应关系,解一元一次方程就非常简单。

解二元一次方程组

我们来看如何求解二元一次方程组。(题目来自人教版七年级数学下)

$$ \begin{cases} x+ y =10,\\ 2 \times x+ y=16   \end{cases} $$

from sympy import *
x,y = symbols('x y')
print(solve([x + y-10,2*x+y-16],[x,y]))

很快就可以得出{x: 6, y: 4},也就是
$$x=6,y=4$$。

解三元一次方程组

我们来看如何解三元一次方程组。(题目来自人教版七年级数学下)

$$ \begin{cases} x+y+z=12,\\ x+2y+5z=22,\\ x=4y.   \end{cases} $$

执行之后,很快可以得出结果{x: 8, y: 2, z: 2},也就是
$$x=8,y=2,z=2$$

解一元二次方程组

比如我们来求解人教版九年级一元二次方程组比较经典的一个题目,$ax^2+bx+c=0$.

from sympy import *
x,y = symbols('x y')
a,b,c=symbols('a b c')
expr=a*x**2 + b*x + c
s_expr=solve( expr, x)
print(s_expr)

执行之后得出的结果为[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)],我们知道根与系数的关系二次方程会有两个解,这里的格式就是一个列表。转为我们常见的数学公式即为:
$$\frac{-b+\sqrt{-4ac+b^2}}{2a} 、-\frac{b+\sqrt{-4ac+b^2}}{2a}$$

微积分Calculus

微积分是大学高等数学里非常重要的学习内容,比如求极限、导数、微分、不定积分、定积分等都是可以使用Sympy来运算的。
求极限
Sympy是使用limit(表达式,变量,极限值)函数来求极限的,比如我们要求$\lim \limits_{x \to 0} \frac{sinx(x)}{x}$的值。

from sympy import *
x, y, z = symbols('x y z')
expr = sin(x)/x
l_expr=limit(expr, x, 0)
print(l_expr)

执行后即可得到结果为1。

求导

可以使用diff(表达式,变量,求导的次数)函数对表达式求导,比如我们要对$sin(x)e^x$进行$x$求导,以及求导两次,代码如下:

from sympy import *
x,y = symbols('x y')
expr=sin(x)*exp(x)
diff_expr=diff(expr, x)
diff_expr2=diff(expr,x,2)
print(diff_expr)
print(diff_expr2)

求导一次的结果就是exp(x)*sin(x) + exp(x)*cos(x),也就是$e^xsin(x)+e^xcos(x)$;求导两次的结果是2*exp(x)*cos(x),也就是
$$2e^xcosx$$

求不定积分

Sympy是使用integrate(表达式,变量)来求不定积分的,比如我们要求$\int(e^x\sin{(x)} + e^x\cos{(x)})\,dx$

from sympy import *
x,y = symbols('x y')
expr=exp(x)*sin(x) + exp(x)*cos(x)
i_expr=integrate(expr,x)
print(i_expr)

执行之后的结果为:exp(x)*sin(x) 转化之后为:
$$e^xsin(x)$$

求定积分

Sympy同样是使用integrate()函数来做定积分的求解,只是语法不同:integrate(表达式,(变量,下区间,上区间)),我们来看如果求解
$\int_{-\infty}^\infty \sin{(x^2)}\,dx$

from sympy import *
x,y = symbols('x y')
expr=sin(x**2)
i_expr=integrate(expr, (x, -oo, oo))
print(i_expr)

执行之后的结果为sqrt(2)*sqrt(pi)/2,也就是
$$\frac{\sqrt{2}\sqrt{\pi}}{2}$$

Sympy能够做的也远不止这些,初高中、大学的数学运算题在Sympy极为丰富的功能里不过只是开胃入门小菜而已。

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的python视频教程栏目!

以上がPython での Sympy 代数シンボリック演算の概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。