在给定的时间间隔内查找函数的根

时间:2014-01-31 16:16:24

标签: python function numpy scipy

我试图在[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)

2 个答案:

答案 0 :(得分:1)

只有在ab之间存在具有不同符号的值时才有根。如果发生这种情况,几乎肯定会有多个根源。你想找到哪一个?

你将不得不采取你对f的了解,以弄清楚如何处理这个问题。如果您知道只有一个根,那么您可以找到本地最小值。如果您知道有两个,则可以找到最小值,并使用该坐标c找到两个根中的一个(ac之间的一个,{{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])