在numpy中使用python数值求解器求解方程

vuv7lop3  于 2023-03-12  发布在  Python
关注(0)|答案(2)|浏览(180)

我有一个等式,如下所示:
R - ((1.0 - np.exp(-tau))/(1.0 - np.exp(-a*tau))) = 0 .
我想用numpy中的数值求解器来求解这个方程中的tau,最好的方法是什么?
该等式中Ra的值对于该公式的不同实现方式而变化,但是当要求解τ时固定在特定值。

mf98qq94

mf98qq941#

在传统的数学符号中,你的方程是

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)
eit6fx6z

eit6fx6z2#

你可以把方程改写成

  • 对于整数a和非零R,您将得到复空间中的a解;
  • a=0,1,...4有解析解(见此处);

所以一般来说,你可能有一个解,多个解,或者没有解,其中一些或全部可能是复值,你可以很容易地把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))

相关问题