Scipy optimize minimize scipy.optimize.minimize和Minuit返回初始猜测值

Scipy optimize minimize scipy.optimize.minimize和Minuit返回初始猜测值,scipy-optimize-minimize,Scipy Optimize Minimize,我在使用scipy.minimize.optimize时遇到问题。这是我的密码 from time import process_time import numpy as np from scipy.optimize import minimize class NMin(object): def __init__(self, error): self.error=error def func(self, N): i = np.arange(1,

我在使用scipy.minimize.optimize时遇到问题。这是我的密码

from time import process_time 
import numpy as np
from scipy.optimize import minimize
class NMin(object):
    def __init__(self, error):
        self.error=error

    def func(self, N):
        i = np.arange(1, N+1)
        f = np.abs(np.sum(4/(N*(1+((i - 0.5)/N)**2))) - np.pi)-self.error
        return(f)

    def nMin(self):
        x0 = 1
        nMin = minimize(self.func, x0)
        return(nMin.x)


def main():
    t1_start = process_time()
    error=10**(-6)
    nMin = NMin(error).nMin()
    print("the minimum value of N is: " + str(nMin))
    t1_stop = process_time() 
    print("Elapsed time during the whole program in seconds:", 
                                         t1_stop-t1_start)

main ()  
我试图最小化函数
func(x)
以找到N最小值,但是
NMin(错误)。NMin()
似乎返回
x0=1
而不是N最小值。这是我的输出

the minimum value of N is: [1.]
Elapsed time during the whole program in seconds: 0.015625

我真的被这个问题困扰,因为我似乎找不到问题所在,也不明白为什么
scipy.optimize
不起作用。

scipy.optimize.minimize
主要用于连续可微函数。在func中使用arange使其成为一个离散问题。由于这些不连续性,这会导致梯度出现大幅跳跃(见下图)

我添加了一些调试打印:

from time import process_time
import numpy as np
from scipy.optimize import minimize
class NMin(object):
    def __init__(self, error):
        self.error=error

    def func(self, N):
        print("func called N = {}".format(N))
        i = np.arange(1, N+1)
        print("i = {}".format(i))
        f = np.abs(np.sum(4/(N*(1+((i - 0.5)/N)**2))) - np.pi)-self.error
        print("f = {}".format(f))
        return(f)

    def nMin(self):
        x0 = 1
        nMin = minimize(self.func, x0)
        return(nMin.x)


def main():
    t1_start = process_time()
    error=10**(-6)
    nMin = NMin(error).nMin()
    print("the minimum value of N is: " + str(nMin))
    t1_stop = process_time()
    print("Elapsed time during the whole program in seconds:",
                                         t1_stop-t1_start)

main()
这导致:

func called N = [1.]
i = [1.]
f = 0.05840634641020706
func called N = [1.00000001]
i = [1. 2.]
f = 1.289175555623012
也许您希望使用更适合离散问题的不同解算器,或者更改目标以满足基于梯度的优化的连续性前提