Sympy のサンプルコード
python
1from sympy.solvers import solve
2from sympy import Symbol
3x = Symbol('x')
4ret = solve(2.5 * x**3 - 1.5 * x, x)
5print(ret) # [-0.774596669241483, 0.0, 0.774596669241483]
Wolfram Alpha の答え
x == -0.774597
x == 0
x == 0.774597
質問欄のコードでは、Symbol('lp') としてもただのシンボルとして認識されてしまいますので、lp = 0 を解いて解 0 となってしまっていました。
方程式は基本的に自分で作成する必要がありますが、Sympy にルシャンドル多項式を作る関数があるので、それを使うと簡潔にかけます。
python
1from sympy import Symbol, legendre, N, solve
2
3x = Symbol('x')
4n = 3
5lp = legendre(n, x)
6print(lp) # 5*x**3/2 - 3*x/2
7
8ret = solve(lp, x) # lp = 0 を x に関して解く。
9print(ret) # 解析解: [0, -sqrt(15)/5, sqrt(15)/5]
10
11# 解析解ではなく数値として取り出したい場合は、N() を使う。
12vals = [N(r) for r in ret]
13print(vals) # [0, -0.774596669241483, 0.774596669241483]
追記
質問のうち、Sympy ではなく、Python の言語に関するものは、Web 上の情報のほうがわかりやすいともうので、
参考リンクを貼っておきます。
import sympyで代用できるのでしょうか?
解答者さんとようなコードと何が違うのですか?
python
1* from sympy import Symbol, legendre, N, solve
モジュールのうち、使用する関数やクラスだけを読み込んでいます。
import sympy
とした場合は、sympy.Symbol(), sympy.legendre()
のようにモジュール名から指定する必要があります。
Python の構文の話なので以下を参照ください。
import の使い方
lp = legendre(n, x) のxの部分をそのままxにしておくと、多項式にした時にxに関する多項式がでてくるという認識で大丈夫ですか?
その認識であっています。回答のコードは sympy.Symbol('x') としているので既にそうなっています。
ret = solve(lp, x)
print(ret)
の部分はprint(solve(lp, x))で代用できますか?
代用できます。結局、関数の返り値を一旦変数に代入するか、直接 print() 関数に渡すかの違いです。
また、このようなsolveなどの()内がそれぞれ何を表しているかなどはどうやって調べればよいですか?
初めて使う関数は 公式リファレンス で使い方を確認しましょう。
sympy を理解するために、とりあえず チュートリアル をやってみてはどうでしょうか。
④vals = [N(r) for r in ret]の意味が分かりません。。。
sympy のオブジェクトを N() という関数で数値に変換しています。
[] は内包記法です。Python の構文の話なので以下を参照ください。
Python の内包表記の使い方まとめ
python
1from sympy import Symbol, legendre, N, solve
2
3x = Symbol('x')
4n = 5
5lp = legendre(n, x)
6print('多項式次数は', n)
7print(lp) # 多項式を出力する
8
9ret = solve(lp, x) # lp = 0 を x について解く
10print('{}次ルジャンドル多項式の零点(解析解)は\n{}'.format(n, ret))
11
12# 解析解ではなく、数値として取り出す
13vals = [N(r) for r in ret]
14print('数値解は')
15print(vals)
16
17with open('out.txt', 'w') as f:
18 for v in vals:
19 f.write(str(v) + '\n')
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/06 15:34
2018/11/06 15:42
2018/11/06 15:46
2018/11/06 16:01 編集
2018/11/06 16:35
2018/11/06 16:41
2018/11/06 16:51
2018/11/06 16:59
2018/11/06 17:10
2018/11/06 17:16
2018/11/06 17:23
2018/11/06 17:35