我如何要求牛顿方法在Python中使用不同的初始猜测重试

我如何要求牛顿方法在Python中使用不同的初始猜测重试,python,optimization,root,newtons-method,Python,Optimization,Root,Newtons Method,我正在解决一个大问题,方程根的位置从一个值到另一个值变化非常快。然而,函数接近于0,所以牛顿法认为有根,但它自己迭代。我希望能够要求根查找器重试,但如果第一次无法收敛,则使用不同的初始猜测,但我不确定如何处理此错误。值得注意的是,我想使用牛顿/割线法,因为由于我正在解决的问题,二分法不会非常有用。下面我举了一个例子来说明我的问题 我搜索了如何处理错误,并查看了scipy.optimize.newton的文档,但找不到如何处理错误并要求它重试。我一直不得不手动输入新的猜测 从numpy导入* 从s

我正在解决一个大问题,方程根的位置从一个值到另一个值变化非常快。然而,函数接近于0,所以牛顿法认为有根,但它自己迭代。我希望能够要求根查找器重试,但如果第一次无法收敛,则使用不同的初始猜测,但我不确定如何处理此错误。值得注意的是,我想使用牛顿/割线法,因为由于我正在解决的问题,二分法不会非常有用。下面我举了一个例子来说明我的问题

我搜索了如何处理错误,并查看了scipy.optimize.newton的文档,但找不到如何处理错误并要求它重试。我一直不得不手动输入新的猜测

从numpy导入*
从scipy导入优化
#定义一个函数,该函数通过1,但在另一个点擦伤它
def f(x):
y=log(exp(-0.8*x)*cos(5*x)+0.62)
返回(y)
#试着找到根
root=optimize.newton(f,x0,tol=1e-7,maxiter=80)

如果我用一些x0值来运行它,这些值相当接近真正的根(~0.2201),它会很快找到它。但是,函数接近0,非常接近1.25,但随后又返回。如果我将x0作为1.25输入,则根查找器无法收敛,错误为“80次迭代后无法收敛,值为nan”。我只想找到一种方法来处理这个错误,并让它再试一次。我有一个根查找器作为一个大函数的一部分,我知道它有一个根,它刚刚移动。因此,当我遇到这个错误时,它只是终止了我希望避免的整个代码。

发生的情况是,您的根查找程序正在抛出一个异常,而您对此没有采取任何措施,这就是您看到错误消息的原因


从:

即使语句或表达式语法正确,也可能导致错误

执行期间检测到的错误称为异常

大多数异常都不会被处理。。。并导致错误消息

由此我们可以看出,错误消息是由于发生了异常而未得到处理而导致的。
中的下一节将定义如何处理错误

从:

可以编写处理所选异常的程序。

try语句的工作原理如下。
•首先,try条款。。。已执行。
•如果在执行try子句期间发生异常,则跳过该子句的其余部分。然后,如果其类型与以except关键字命名的异常匹配,则执行except子句,[然后程序跳过try子句的其余部分并在except子句之后继续]
•如果发生与except子句中指定的异常不匹配的异常,[将引发该异常,并可通过围绕当前异常的try-catch子句捕获该异常]

利用这些信息,我们可以解决您的问题


我们需要将您对根查找器的调用封装在
try
子句中:

try:
    root = optimize.newton(f, x0, tol = 1e-7, maxiter=80)
...
由于
root
现在是
try
子句作用域的局部,我们需要在以下范围之外声明它:

root = x0 
try:
    root = optimize.newton(f, x0, tol = 1e-7, maxiter=80)
...
我们现在需要添加except子句,以使用不同的值进行尝试:

root = x0 
try:
    root = optimize.newton(f, x0, tol = 1e-7, maxiter=80)
except YOUR EXCEPTION:
    root = optimizes.newton(f, other_x0, tol = 1e-7, maxiter=80)
您需要将
您的异常
替换为达到最大迭代次数时引发的异常的名称。

或者,您可以将其替换为
Exception
,以捕获抛出的任何异常,但不建议这样做,因为您可能会捕获另一个您不知道必须修复的异常。

是否要通过从X0开始而不更改X0或在每个步骤更改X0来查找函数的所有根?如何建议所有接近函数根的X0在x=1.25时,函数有一个双根。也许这就是失败的原因!非常感谢,这更有意义。我承认我不是一个很强的程序员,所以我不确定我会把什么作为例外。当它不收敛时,它所做的就是返回一条错误消息,上面写着“RuntimeError:在80次迭代后未能收敛,值为nan”。我不确定如何将此输出转换为异常,然后将其放入。感谢您环顾四周,我相信“您的异常”会变成“RuntimeError”。这就是我想要它做的-如果我不正确,请让我知道。多谢各位!对不起,昨天没有回复!使用“RuntimeError”是正确的,错误消息的开头总是有异常的名称。我很高兴你能找到它,并发现虽然这是90%的编程。祝你好运