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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2170閲覧

関数Bの引数に関数Aを入れ,関数Aを変換した関数Cを定義する.このような関数Bは作ることができますか?

gel

総合スコア42

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/10/18 02:41

編集2016/10/18 07:42

不足もあるかもしれませんが,具体的な形は以下のようになっています.

python

1def A(list): 2 return 3*list[0] + list[1] 3def B(A): 4 a = sympy.Symbol("a") 5 b = sympy.Symbol("b") 6 y = A([a,b]) 7 #y = 3*a + b 8 y_a = sympy.diff(y**2,a) 9 y_b = sympy.diff(y**2,b) 10 Y = y_a+y_b 11 #Y = 24*a + 8*b 12 C = ????? 13 return C # 文字列aとbをlist引数としたものを作りたい 14""" 15このような関数と同様 16def C(list): 17 return 24*list[0] + 8*list[1] 18""" 19>>>A([1,2]) 20#5 21>>>C = B(A) 22>>>C([1,2]) 23#40

listを引数にすると関数Aは結果を返してくれます.
関数Cにもlistを引数に結果を返してくれる機能をつけたいのですが,
Cの引数は関数Aにしたいのです.(関数Aを変換するため)
関数Bを応用すれば関数Cと同様の結果を出すことは可能ですが,あくまで上記の
ようにlistを引数にしたいのです.
できるだけsymbolを使用した演算を減らすために関数Cを定義したいので,
関数Bを通して

python

1def C(list): 2 return 24*list[0] + 8*list[1]

を定義するのが今回の目的になります.
どうぞよろしくお願い致します.

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

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

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

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

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

guest

回答2

0

ベストアンサー

高階関数を用いれば可能かと思います.
以下のコードでどうでしょうか.

Python

1import sympy 2 3def A(list): 4 return 3 * list[0] + list[1] 5 6def B(A): 7 def C(list): 8 a = sympy.Symbol("a") 9 b = sympy.Symbol("b") 10 y = A([a, b]) 11 y_a = sympy.diff(y ** 2., a) 12 y_b = sympy.diff(y ** 2., b) 13 Y = y_a + y_b 14 return Y.subs([(a, list[0]), (b, list[1])]) 15 return C 16

投稿2016/10/21 18:27

rgsk

総合スコア39

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

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

gel

2016/10/23 16:42

こちらのコードで解決しました.ありがとうございました.
guest

0

以下のコードでいかがでしょうか?

Python

1def A(list): 2 return 3*list[0] + list[1] 3def C(list): 4 a = Symbol("a") 5 b = Symbol("b") 6 y = A([a,b]) 7 #y = 3*a + b 8 y_a = diff(y**2,a) 9 y_b = diff(y**2,b) 10 a1 = y_a.subs([(a,list[0]),(b,list[1])]) 11 b1 = y_b.subs([(a,list[0]),(b,list[1])]) 12 return a1+b1 13print(C([1,2]))

関数Cに偏微分で求めたlist[0]、list[1]を掛け合わせる関数を作りたいということかと思いますが、結局それぞれに代入して足し合わせるのであれば、上記でやっていることは同様になるかと思います。
(Sympyでa、bの係数を求めるような関数があれば、ご所望のコードになるかと思いますが、すみません、私が調べた範囲ではみつけられませんでした)

イメージ説明

修正:
現在のように、Aにもlistのデータを渡すと、Aはlistのデータを渡した瞬間に数値になってしまうため、B(A)とした場合、微分すると0になってしまうかと思います。
以下のように、Aを予めBの中に入れ込んでしまった方が良いように思うのですが、どうでしょうか?
検討違いでしたらすみません。

Python

1def B(list): 2 a = Symbol("a") 3 b = Symbol("b") 4 y = 3*a+b 5 y_a = diff(y**2,a) 6 y_b = diff(y**2,b) 7 Y = y_a+y_b 8 C = diff(Y,a)*list[0]+diff(Y,b)*list[1] 9 return C # 文字列aとbをlist引数としたものを作りたい 10print(B([1,2]))

投稿2016/10/18 07:24

編集2016/10/18 08:12
cesolution

総合スコア217

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

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

gel

2016/10/18 07:36

回答ありがとうございます.やりたいことは,その通りなのです.しかし今回は関数Bを通して関数Cを定義することだったんです.後出しで申し訳ないのですができる限りsymbolを通した演算を減らしたいと考えているのです.質問文を修正します.ありがとうございました.
gel

2016/10/19 03:56

追記ありがとうございます.参考にさせていただきます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問