~ 本目录主要用于存放 6w 课程作业

Q:

Q1.

用lambda定义方式写二元函数(碗形等高线),求出来的最小值x数组只有一个元素。

f71 = lambda x,y:(x-1)**2+(y-1)**2
X_opt = opt.minimize(f71, 2, 3)
X_opt

输出:

      fun: 4.0
 hess_inv: array([[ 0.50000001]])
      jac: array([ 0.])
  message: 'Optimization terminated successfully.'
     nfev: 12
      nit: 2
     njev: 4
   status: 0
  success: True
        x: array([ 0.99999998])

Q2.

为什么在同样精度下,标准python(方法一)能计算出准确值,而numpy(方法二)和scipy只是计算出近似值?

方法一代码:

# 二分法函数方法一:标准python
def mybisect1(f,a,b):
    eps = 0.000000000001
    if f(a)*f(b)==0:
        if f(a)==0:
            x0 = a
        else:
            x0 = b
    else:
        while f(a)*f(b)<0:
            c = (a+b)/2
            if f(c)==0:
                x0 = c
                break
            elif f(c)*f(b)<0:
                a = c
            elif f(a)*f(c)<0:
                b = c
            elif abs(a-b) < eps:
                x0 = a
                break
    return x0

方法一输出:

(-5.0, 2.0)

方法二代码:

# 二分法函数方法二:numpy
def mybisect2(f,a,b):
    eps = 0.000000000001
    while f(a)*f(b) <=0:
        c = (a+b)/2
        if f(a)*f(b)*f(c) == 0:
            x0 = np.where(f(a)==0,a,np.where(f(b)==0,b,c)).tolist()
            break
        else:
            a = np.where(f(c)*f(b)<0,c,a)
            b = np.where(f(a)*f(c)<0,c,b)            
            if abs(a-b) < eps:
                x0 = a.tolist()
                break
    return x0

方法二输出:

(-5.000000000000341, 2.0)