質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4271閲覧

pythonで方程式を解きたいのですが。。。

Tubasa1995

総合スコア83

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/06 15:17

編集2018/11/06 15:26

方程式を解きたい!!

下のようなソースコードを打ち込みました。すると下のような出力がされました。
私がしたいことは、2.5 x^3 - 1.5 x = 0の答えが欲しいのですが、[0]という出力になってしまいます。たぶん、多項式が文字として認識されているからですか?
ただ、今日pythonを始めたばかりなのでどうすればよいかよくわかりません。
どなたか教えてください。

発生している問題

poly order= 3
3
2.5 x - 1.5 x
x= 2
17.0
[0]

該当のソースコード

import numpy
import sympy
from scipy import special

num=3
lp=special. legendre(num)
print('poly order=',num)
print(lp)
num2=2
print('x=',num2)
print(lp(2))
lp=sympy.Symbol('lp')
x=sympy.Symbol('x')
print(sympy.solve(lp))

###使用言語
python

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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:32

編集2018/11/06 17:22
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tubasa1995

2018/11/06 15:34

あ、すいません、これのやり方はわかるんです。 ただ、同じコード内で解きたいんです。
tiitoi

2018/11/06 15:42

> 同じコード内で解きたいんです。 どういうことでしょうか? 解きたいのは、2.5 * x**3 - 1.5 * x=0 ではなく、lp = 0 ということですか?
Tubasa1995

2018/11/06 15:46

そうです!! lp=0を解きたいです!
tiitoi

2018/11/06 16:01 編集

追記しました。sympy.legendre(n, x) でルシャンドル多項式を作れます。
Tubasa1995

2018/11/06 16:35

from sympy import Symbol, legendre, N x=Symbol('x') lp=legendre(3,x) print(lp) ret=sympy.solve(lp) print(ret) と打ち込みましたが 5*x**3/2 - 3*x/2 Traceback (most recent call last): File ".\honmono.py", line 7, in <module> ret=sympy.solve(lp) NameError: name 'sympy' is not defined PS C:\Users\翼\Desktop\Python> と出てきました、何がいけないのですか?
tiitoi

2018/11/06 16:41

すいません。一部 import の部分に不足があったので修正しました。これでどうでしょうか。
Tubasa1995

2018/11/06 16:51

できました、ありがとうございます。 ただ、今日始めたばかりなので、意味も分からずやったのでいくつか教えてください。 ①from sympy import Symbol, legendre, N, solveの の部分は import sympyで代用できるのでしょうか? 解答者さんとようなコードと何が違うのですか? ②lp = legendre(n, x) のxの部分をそのままxにしておくと、多項式にした時にxに関する多項式がでてくるという認識で大丈夫ですか? ③ret = solve(lp, x) print(ret) の部分はprint(solve(lp, x))で代用できますか? また、このようなsolveなどの()内がそれぞれ何を表しているかなどはどうやって調べればよいですか? ④vals = [N(r) for r in ret]の意味が分かりません。。。 質問多くてすいません。
Tubasa1995

2018/11/06 16:59

これをout.txtなどの形式のファイルで出力するにはどうすればよいですか? 例えば、先ほどのコードの続きに out=open('out.txt','w') for i in range(n): out.write(str(data[i])) out.write('\n') out.close() みたいな感じでしょうか。素人ですいません。。
tiitoi

2018/11/06 17:10

質問について、回答を追記しました。 ファイルの書き出しは上記のやり方であっています。 Python は今日始められたとのことなので、Web上の解説サイトまたは入門書を購入して、Python についてひと通り理解されてから、sympy を試されたほうがよいように思います。
Tubasa1995

2018/11/06 17:16

すいません、たびたび申し訳ありません。 書き出しのコードがエラーが出るのですが何か違いますか? from sympy import Symbol, legendre, N, solve x=Symbol('x') n=5 lp=legendre(n,x) print('多項式次数は',n) print(lp) #多項式を出力する ret=solve(lp,x) #lp=0をxについて解く print(n,'次ルジャンドル多項式の零点(解析解)は') print(ret) #解析解の出力 #解析解ではなく数値として取り出す vals=[N(r) for r in ret] print('数値解は') print(vals) out=open('out.txt','w') for i in range(n): out.write(str(data[i])) out.write('\n') out.close() と打ったら File ".\honmono.py", line 20 out.write(str(data[i])) ^ IndentationError: expected an indented block となってしまいました。。。
tiitoi

2018/11/06 17:23

IndentationError はインデントが不適切という構文エラーです。 回答に追記したように適用にインデントする必要があります。
Tubasa1995

2018/11/06 17:35

本当にありがとうございました!!!!!!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問