~ 本目录主要用于存放 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)