`scipy.integrate.solve_ivp`のイベント関数にパラメータを渡す方法は?

スティーブハイム

Scipyは、ダイナミクス関数の追加の引数の受け渡しをサポートしなくなったodeint方向に向かってsolve_ivpいます。代わりに、ラムダが推奨されます。しかし、同じことをイベントにしようとすると、正しく機能しません。何かご意見は?

MWE(ドキュメントページから変更):

import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# dynamics of a simple mass with ballistic flight and a bit of drag
def cannon(t, y, p): 
    return [y[2],y[3], -p['friction']*y[2], p['gravity']-p['friction']*y[3]]

# termination condition: cannonball hits the ground
# this event does not require parameters, but more complex events might
def hit_ground1(t, y, p): 
    return y[1]
hit_ground1.terminal = True
hit_ground1.direction = -1

def hit_ground2(t,y):
    return y[1]
hit_ground2.terminal = True
hit_ground2.direction = -1

p = {'gravity':-1,'friction':0} # paramters as a dict
y0 = [0, 0, 0, 10] # initial conditions
t_span = [0, 22] # integration time a bit over what is necessary

# we can handle dynamics with parameters by using lambdas
# but somehow the same doesn't seem to work with events
sol1 = solve_ivp(fun=lambda t,x:cannon(t,x,p), t_span=t_span, 
    y0=y0, events=hit_ground2, max_step=0.01)    
sol2 = solve_ivp(fun=lambda t,x:cannon(t,x,p), t_span=t_span, 
    y0=y0, events=lambda t,x:hit_ground1(t,x,p), max_step=0.01)

print(sol1.t[-1]) # terminates correctly
print(sol2.t[-1]) # continues integrating
plt.plot(sol1.t,sol1.y[1], linewidth=3)
plt.plot(sol2.t,sol2.y[1],'--',linewidth=3)
plt.show()

ここに画像の説明を入力してください

アレックスbGoode

イベントの性質、terminalとはdirection、あなたのラムダ式に転送されません。ラムダを変数に保存し、hit_ground1関数ではなくそこにプロパティを追加する必要があります。

def hit_ground1(t, y, p):
    return y[1]

ground_event = lambda t,x:hit_ground1(t,x,p)
ground_event.terminal = True
ground_event.direction = -1

このイベントを使用すると、期待どおりに機能するはずです。

 sol2 = solve_ivp(fun=lambda t,x:cannon(t,x,p), t_span=t_span,
    y0=y0, events=ground_trigger, max_step=0.01)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

引数を使用して配列をscipy.integrate.solve_ivpに渡す方法は?

分類Dev

How to pass an array to scipy.integrate.solve_ivp using args?

分類Dev

LowLevelCallableとしてscipy.integrate.quadに渡されたnumba cfuncに追加のパラメーターを渡す方法

分類Dev

scipy.integrateにcython関数とcythonメソッドを渡す

分類Dev

Python solve_ivp [scipy.integrate]: how to set the number of output points of your integration process?

分類Dev

scipy.integrate.odeintとscipy.integrate.odeの違いは何ですか?

分類Dev

scipy.integrateの予期しない動作

分類Dev

scipy.integrate.odeint使用時のTypeError

分類Dev

SciPy RK45(solve_ivp)は関数評価の数を正確にカウントしますか?

分類Dev

複数のscipy.integrate.odeインスタンス

分類Dev

ノイマン境界条件のscipy.integrate.solve_bvp?

分類Dev

scipy.integrate.ode.integrate()はどのように機能しますか?

分類Dev

scipy.integrate.solve_ivp形式0 = F(t、y(t)、y '(t))の暗黙のODEを解決する方法が不明

分類Dev

scipy.integrate.nquadでcffi関数を使用する

分類Dev

solve_ivpの引数を渡す(新しいSciPy ODE API)

分類Dev

scipy.integrate.ode(または別の)関数で初期条件を書く方法は?

分類Dev

scipy.optimize.curve_fitscipy.integrate.quadとの定積分関数

分類Dev

scipy.integrate.ode.integrate()のオプションの `step`および` relax`引数は何をしますか?

分類Dev

SIRモデルにscipy.integrate.RK45を実装する

分類Dev

Rはscipy.integrate.simps()と同等ですか?

分類Dev

複雑な統合境界を持つPythonのscipy.integrate.quad

分類Dev

scipy.integrate.quadを使用してガンマ関数を統合する

分類Dev

Using cffi function with scipy.integrate.nquad

分類Dev

Large array returned from scipy integrate quad

分類Dev

scipy.integrateのOdeint関数が間違った結果をもたらす

分類Dev

Pythonのscipy.integrate.quadでパラメーターepsabsを使用するにはどうすればよいですか?

分類Dev

どのように適切にscipy.integrate.Radauを実装するには?

分類Dev

Pythonのscipy.integrate.quadを使用して多変量関数の単一積分を評価する方法は?

分類Dev

`scipy.integrate.odeint`の使用中にエラーが発生しました

Related 関連記事

  1. 1

    引数を使用して配列をscipy.integrate.solve_ivpに渡す方法は?

  2. 2

    How to pass an array to scipy.integrate.solve_ivp using args?

  3. 3

    LowLevelCallableとしてscipy.integrate.quadに渡されたnumba cfuncに追加のパラメーターを渡す方法

  4. 4

    scipy.integrateにcython関数とcythonメソッドを渡す

  5. 5

    Python solve_ivp [scipy.integrate]: how to set the number of output points of your integration process?

  6. 6

    scipy.integrate.odeintとscipy.integrate.odeの違いは何ですか?

  7. 7

    scipy.integrateの予期しない動作

  8. 8

    scipy.integrate.odeint使用時のTypeError

  9. 9

    SciPy RK45(solve_ivp)は関数評価の数を正確にカウントしますか?

  10. 10

    複数のscipy.integrate.odeインスタンス

  11. 11

    ノイマン境界条件のscipy.integrate.solve_bvp?

  12. 12

    scipy.integrate.ode.integrate()はどのように機能しますか?

  13. 13

    scipy.integrate.solve_ivp形式0 = F(t、y(t)、y '(t))の暗黙のODEを解決する方法が不明

  14. 14

    scipy.integrate.nquadでcffi関数を使用する

  15. 15

    solve_ivpの引数を渡す(新しいSciPy ODE API)

  16. 16

    scipy.integrate.ode(または別の)関数で初期条件を書く方法は?

  17. 17

    scipy.optimize.curve_fitscipy.integrate.quadとの定積分関数

  18. 18

    scipy.integrate.ode.integrate()のオプションの `step`および` relax`引数は何をしますか?

  19. 19

    SIRモデルにscipy.integrate.RK45を実装する

  20. 20

    Rはscipy.integrate.simps()と同等ですか?

  21. 21

    複雑な統合境界を持つPythonのscipy.integrate.quad

  22. 22

    scipy.integrate.quadを使用してガンマ関数を統合する

  23. 23

    Using cffi function with scipy.integrate.nquad

  24. 24

    Large array returned from scipy integrate quad

  25. 25

    scipy.integrateのOdeint関数が間違った結果をもたらす

  26. 26

    Pythonのscipy.integrate.quadでパラメーターepsabsを使用するにはどうすればよいですか?

  27. 27

    どのように適切にscipy.integrate.Radauを実装するには?

  28. 28

    Pythonのscipy.integrate.quadを使用して多変量関数の単一積分を評価する方法は?

  29. 29

    `scipy.integrate.odeint`の使用中にエラーが発生しました

ホットタグ

アーカイブ