我需要使用牛顿方法调用给定函数值为0的点。
该功能由:
给出def F(x):
F = np.zeros(2)
F = np.array([x[0] - 0.25 * (np.cos(x[0])-np.sin(x[1])),x[1] - 0.25 * (np.cos(x[0])-2*np.sin(x[1]))])
return F
我为该方法编写的代码是:
def Newton(F,dFinv,x0,tol,maxit):
x = np.zeros((x0.size,maxit))
Converged = False
i = 0
for i in range(maxit):
s = np.dot(dFinv(x), F(x))
x -= s
if np.linalg.norm(s) < tol*np.linalg.norm(x):
return x, True,i
return x,Converged,maxit
其中dFinv
代表逆矩阵,maxit
代表迭代的maixmum。至于callculte dFinv我写了另一个函数(我们不允许使用.inv()
):
def dFinv(x):
dF = np.zeros((2,2))
dF = np.array([[ 1. + 0.25*np.sin(x[0]), 0.25*np.cos(x[1])],[-0.25* np.sin(x[0]),1+0.5*np.cos(x[1])]])
dFinv = np.linalg.solve(dF,np.eye(2))
return dFinv
但是当我尝试运行代码时(使用起始点x=np.array([1.0,1.0])
),我在solve
中收到了dFinv(x)
的错误:
numpy.linalg.linalg.LinAlgError: Last 2 dimensions of the array must be square
我抬起头来看,错误到底意味着什么,但我不确定这是怎么可能的......无论我给函数赋值的是什么,矩阵都应该是正方形...