4

次の方程式のルートを見つけるために、scipy を使用していくつかのコードを作成しました。

def equation(x, y):
     return (x / y) * np.log((a * x / b) + 1.0) - 2.0 * c * c

a、b、および c スカラーを使用します。

長方形のグリッド (Y、形状 300x200 など) に y の値があり、各点の方程式を解く対応する x を見つける必要があります。また、各ポイント (X0、形状 300x 200) での x の値の開始推定値もあります。

現時点では、配列 Y の各項目をループして次のように呼び出すことで、これを解決できました。

for index, value in np.ndenumerate(Y):
    result[index] = scipy.optimize.newton(equation, X0[index], args=(value))
    # or other scalar solvers like brentq

これは機能しますが、遅すぎてスクリプトをリリースできません。値がグリッド上に編成され、Y および結果の配列に「連続した」値が含まれているという事実を考えると、たとえば、配列の端から中心に向かって徐々に変化するなど、適切な配列指向/多次元の解決方法が必要であると確信しています。その問題は、パフォーマンスを向上させる可能性もあります。

いくつかのオプションを試しましたが、これまでのところ成功していません。何か案が?

どんな助けでも大歓迎です。

ありがとう

4

2 に答える 2

2

(コメントの拡大) @askewchan が彼の回答で示しているように、ここでの実行時間は、実際に方程式を解くことによって支配されます。

ここで私がすることは次の2*c*cとおりyですa/bt log (1 + t) = z残っているのは、 とがtzに関連しているxという形式の方程式ですy。必要な範囲
で の値を集計し、vsを補間すると、方程式の解が得られます。配列との形状に関係なく、1D 補間のみが必要であることに注意してください。 z = t log(1 + t)tzXY

補間の場合scipy 、さまざまな補間子があります。最も簡単に使用できるのは、おそらくinterp1d、またはUnivariateSpline. それらはすべてベクトル化された操作をサポートしているため、おそらく評価をベクトル化できます。これでパフォーマンス的に十分な場合は、準備完了です。

x必要なとの値の範囲に応じてy、境界での明示的な機能的動作を使用して集計を拡張したい場合としない場合があります [たとえば、t log(1 + t)アプローチt^2などt->0]。それが必要な場合は、 https: //bitbucket.org/burovski/tabulations を参照してください--- これは非常に醜いですが、機能します [scipy にはより良い代替手段を用意するための作業がいくつかありますが、それは一瞬]。

于 2013-11-07T17:25:50.397 に答える