代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import leastsq
m=10
n=4
A = np.random.randint(1,10,(m,n))
b = np.random.randint(1,10,(m,1))
x = np.random.randint(1,10,(n,1))
def residual(x):
x = x.reshape(n,1) #变成n*1
ret = A@x-b
return ret.T.reshape(m) #变回1*n
x_p = leastsq(residual,x)
print("x=",x_p[0].reshape(n,1))
print("residual=",A@(x_p[0].reshape(n,1))-b)
print(np.linalg.norm(A@(x_p[0].reshape(n,1))-b))
输出:
x=
[[ 0.34854529]
[ 0.3006728 ]
[-0.1233362 ]
[ 0.2417467 ]]
residual=
[[-4.10413313]
[-3.70371822]
[ 0.52974956]
[ 3.66953778]
[ 1.14643057]
[-0.98232759]
[-1.40749502]
[ 1.80895905]
[-0.0451012 ]
[ 0.94175622]]
7.261484972453751
和matlab一样,没有最大值函数,只能把函数取负后找最小值,通过加负号变回最大值。
代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
import math
func = lambda x: math.pow(np.sin(x - 2), 2) * np.exp(-1 * (x ** 2)) * (-1)
ans = minimize(func,0)
print(ans.x[0])
print(-ans.fun)
输出:
0.21624131913960304
0.9116854118471545
求出每两行之间的距离。
代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist
import math
x = np.array([[1,1,1,1],[2,2,2,2],[4,4,4,4]])
dist = pdist(x,metric='euclidean')
print(dist)
输出:
[2. 6. 4.]
这里可以看出算的顺序是从第一行为起点算完其余行后,再从第二行算起。