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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

Q&A

解決済

2回答

1835閲覧

2変数関数を一文字固定して最適化したい

cream_puff

総合スコア6

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

最適化

最適化とはメソッドやデザインの最適な処理方法を選択することです。パフォーマンスの向上を目指す為に行われます。プログラミングにおける最適化は、アルゴリズムのスピードアップや、要求されるリソースを減らすことなどを指します。

Python

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

0グッド

0クリップ

投稿2021/06/30 07:11

前提・実現したいこと

2変数関数において変数の片方を固定し、1変数関数にして最適化する処理を考えています。
下記のように、a が変わるたび関数を定義するのではなく、a を代入すると、z = calcx(a) + y**2 を最適化して、そのときの y を出力する関数をつくりたいです。

該当のソースコード

from scipy.optimize import minimize_scalar def f(x, y): """最適化関数""" z = x + y**2 return z def calcx(a): """x の値を出力します""" x = a return x
def f_1(y): z = calcx(1) + y**2 return z res1 = minimize_scalar(f_1, method='brent') print(res1.x)

9.803862664247969e-09

# a = 2 def f_2(y): z = calcx(2) + y**2 return z res2 = minimize_scalar(f_2, method='brent') print(res2.x)

3.195989188427313e-11

# a = 3 def f_3(y): z = calcx(3) + y**2 return z res3 = minimize_scalar(f_3, method='brent') print(res3.x)

3.195989188427313e-11

試したこと

x をグローバル変数にすれば実現可能ですが、グローバル変数は使わない方法をお願いします。

def f(y): """最適化関数""" z = x + y**2 return z def calcx(a): """x の値を出力します""" global x x = a def calcres(a): calcx(a) res = minimize_scalar(f, method='brent') print(res.x) calcres(1) calcres(2) calcres(3)

9.803862664247969e-09
3.195989188427313e-11
3.195989188427313e-11

補足情報(FW/ツールのバージョンなど)

python 3.8.8

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

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

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

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

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

guest

回答2

0

良い回答がppaulさんから付いていますが、関数fを変更できないのであれば、関数のラッパーを作る方法があります。

python

1def f_1(y): 2 return f(1, y)

また、同じことですが、lambda式でもできますね。

python

1from scipy.optimize import minimize_scalar 2 3def f(x, y): 4 z = x + y**2 5 return z 6 7 8res1 = minimize_scalar(lambda y: f(1, y), method='brent') 9print(res1.x) 10 11res1 = minimize_scalar(lambda y: f(2, y), method='brent') 12print(res1.x) 13 14res1 = minimize_scalar(lambda y: f(3, y), method='brent') 15print(res1.x)

投稿2021/06/30 10:56

TakaiY

総合スコア13790

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

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

cream_puff

2021/07/01 02:19

ありがとうございます。今回は関数 f を変更することができたのでppaulさんの回答をベストアンサーにさせていただきました。今後、変更できない場合に遭遇した時は参考にさせていただきます。
guest

0

ベストアンサー

関数を生成する関数の作り方は以下です。

python

1>>> def gen_f(a): 2... def f(y): 3... z = a + y**2 4... return z 5... return f 6... 7>>> f_1 = gen_f(1) 8>>> 9>>> print(f_1(1)) 102 11>>> print(f_1(3)) 1210 13>>> 14>>> f_2 = gen_f(2) 15>>> 16>>> print(f_2(1)) 173 18>>> print(f_2(3)) 1911

欲しいものがこれと違うのであれば、何が欲しいかを質問に追加してください。

投稿2021/06/30 07:26

ppaul

総合スコア24670

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

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

cream_puff

2021/07/01 02:19

解決しました。関数を定義する関数があるとは存じ上げませんでした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問