web-dev-qa-db-ja.com

python numpyの数値ソルバーを使用して方程式を解く

次のような方程式があります。

R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau))) = 0

Numpy内で利用可能な数値ソルバーを使用して、この方程式のtauを解きます。これについて行く最善の方法は何ですか?

この式のRおよびaの値は、この式の実装ごとに異なりますが、tauを解く場合は特定の値に固定されます。

27
stars83clouds

従来の数学表記では、方程式は

$$ R = \frac{1 - e^{-\tau}}{1 - e^{-a\cdot\tau}}$$

SciPy fsolve関数は、指定された式がゼロ(式の「ゼロ」または「ルート」)に等しいポイントを検索します。 fsolveに、希望するソリューションに「近い」初期推定値を提供する必要があります。このような最初の推測を見つける良い方法は、式をプロットしてゼロ交差を探すことです。

#!/usr/bin/python

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import fsolve

# Define the expression whose roots we want to find

a = 0.5
R = 1.6

func = lambda tau : R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau))) 

# Plot it

tau = np.linspace(-0.5, 1.5, 201)

plt.plot(tau, func(tau))
plt.xlabel("tau")
plt.ylabel("expression value")
plt.grid()
plt.show()

# Use the numerical solver to find the roots

tau_initial_guess = 0.5
tau_solution = fsolve(func, tau_initial_guess)

print "The solution is tau = %f" % tau_solution
print "at which the value of the expression is %f" % func(tau_solution)
41
nibot

方程式を次のように書き換えることができます

eq

  • 整数aおよびゼロ以外のRの場合、複素空間でa解を取得します。
  • a=0,1,...4here を参照)には分析ソリューションがあります。

そのため、一般的に、1つ、複数のソリューションがあるか、ソリューションがない場合があり、それらの一部またはすべてが複雑な値になる場合があります。この式で scipy.root を簡単にスローできますが、すべての解を見つけることを保証する数値的方法はありません。

複雑な空間で解くには:

import numpy as np
from scipy.optimize import root

def poly(xs, R, a):
    x = complex(*xs)
    err = R * x - x + 1 - R
    return [err.real, err.imag]

root(poly, x0=[0, 0], args=(1.2, 6))
10
behzad.nouri