我试图在[0, pi/2]
之间找到函数的根,scipy中的所有算法都有这样的条件:f(a)
和f(b)
必须有相反的符号。
在我的情况下f(0)*f(pi/2) > 0
有任何解决方案,我确切地说我不需要[0, pi/2]
之外的解决方案。
功能:
def dG(thetaf,psi,gamma) :
return 0.35*((cos(psi))**2)*(2*sin(3*thetaf/2+2*gamma)+(1+4*sin(gamma)**2)*sin(thetaf/2)-sin(3*thetaf/2))+(sin(psi)**2)*sin(thetaf/2)
答案 0 :(得分:1)
只有在a
和b
之间存在具有不同符号的值时才有根。如果发生这种情况,几乎肯定会有多个根源。你想找到哪一个?
你将不得不采取你对f
的了解,以弄清楚如何处理这个问题。如果您知道只有一个根,那么您可以找到本地最小值。如果您知道有两个,则可以找到最小值,并使用该坐标c
找到两个根中的一个(a
和c
之间的一个,{{1}之间的另一个曾经被称为c
的东西。
你需要知道你正在寻找什么才能找到它。
答案 1 :(得分:1)
根据评论和@Mike Graham的回答,你可以做一些能够检查标志变化的地方。鉴于y = dG(x, psi, gamma)
:
x[y[:-1]*y[1:] < 0]
将返回您更改符号的位置。您可以通过迭代过程以数字方式查找根,直到您需要的误差容差:
import numpy as np
from numpy import sin, cos
def find_roots(f, a, b, args=[], errTOL=1e-6):
err = 1.e6
x = np.linspace(a, b, 100)
while True:
y = f(x, *args)
pos = y[:-1]*y[1:] < 0
if not np.any(pos):
print('No roots in this interval')
return roots
err = np.abs(y[pos]).max()
if err <= errTOL:
roots = 0.5*x[:-1][pos] + 0.5*x[1:][pos]
return roots
inf_sup = zip(x[:-1][pos], x[1:][pos])
x = np.hstack([np.linspace(inf, sup, 10) for inf, sup in inf_sup])