使用scipy为y的不同值找到表达式y = f(x)的根

时间:2017-07-13 03:13:55

标签: python numpy scipy

我有以下功能。

import numpy as np
from scipy import optimize

def func(x):
    theta = np.arccos(1 - 2*x)
    return 2*(theta - np.sin(theta))

问题:我想找到y = func(x)的不同值的表达式y的根。例如,如果y =1我可以修改上述函数如

import numpy as np
from scipy import optimize

def func(x):
    theta = np.arccos(1 - 2*x)
    return 2*(theta - np.sin(theta)) - 1

initial_guess = 0
sol = optimize.root(func, initial_guess)

获得所需的根。让我们假设存在这样的根,并且我们知道所有不同y值的适当初始猜测。

我需要做哪些修改?

2 个答案:

答案 0 :(得分:1)

你的initial_guess的问题,这只是你的函数的奇点。因此,如果你稍微改变initial_guess,你可以获得一个很好的解决方案......

>>> initial_guess = 0.001                                                                                                                                                                                                                                
>>> sol = optimize.root(func, initial_guess)
>>> sol                                                                                                                                                                                                                                                                         
    fjac: array([[-1.]])                                                                                                                                                                                                                                                        
     fun: array([ -2.22044605e-16])                                                                                                                                                                                                                                             
 message: 'The solution converged.'                                                                                                                                                                                                                                             
    nfev: 11                                                                                                                                                                                                                                                                    
     qtf: array([  2.99071878e-12])                                                                                                                                                                                                                                             
       r: array([-3.71631332])                                                                                                                                                                                                                                                  
  status: 1                                                                                                                                                                                                                                                                     
 success: True                                                                                                                                                                                                                                                                  
       x: array([ 0.46328511])                                                                                                                                                                                                                                                  
>>>   

请注意。由于问题奇异性,如果您的初始猜测为负或零,则无法获得数值解。

答案 1 :(得分:1)

要改变左侧,您可以为func添加额外的参数,然后通过scipy.optimize.rootargs关键字传递此参数(记住rths answer) :

import numpy as np
from scipy import optimize

def func(x, lhs):
    theta = np.arccos(1 - 2*x)
    return 2*(theta - np.sin(theta)) -  lhs

initial_guess = 0.001
lhs = 1
sol = optimize.root(func, initial_guess, args=(lhs,))