Python 数值逼近向量的雅可比矩阵
我必须找到函数的雅可比矩阵Python 数值逼近向量的雅可比矩阵,python,numpy,scipy,Python,Numpy,Scipy,我必须找到函数的雅可比矩阵 def(x): 返回np.array([ np.sin(x[0])+0.5*(x[0]-x[1])**3-1.0, 0.5*(x[1]-x[0])**3+x[1] ]) 其中一个要求是,如果没有指定dx,我需要将其设置为10e-5。我有两个参数要打印出来,它们将运行我编写的函数。以下是我到目前为止的情况: def jac(f, x0, dx=None): x0 = np.atleast_1d(x0) x = np.copy(x0) f0 =
def(x):
返回np.array([
np.sin(x[0])+0.5*(x[0]-x[1])**3-1.0,
0.5*(x[1]-x[0])**3+x[1]
])
其中一个要求是,如果没有指定dx,我需要将其设置为10e-5。我有两个参数要打印出来,它们将运行我编写的函数。以下是我到目前为止的情况:
def jac(f, x0, dx=None):
x0 = np.atleast_1d(x0)
x = np.copy(x0)
f0 = np.copy(f)
N = x.size
i = 0
if dx is None:
dx = 10^-5*np.ones(N)
else:
dx = np.atleast_1d(N)
for i in range(N):
J=np.zeros([N,N])
x[i]=x[i]+dx[i]
J[:,i]=(f(x)-f0)/dx[i]
return J
print(jac(f,(1,2),dx=(1e-3,1e-3)))
print('\n')
print(jac(f, np.array((1.0,2.0))))
我一直在获取错误-:“float”和“function”的不支持的操作数类型
TypeError Traceback (most recent call last)
<ipython-input-58-3e78218d0309> in <module>()
23 J[:,i]=(f(x)-f0)/dx[i]
24 return J
---> 25 print(jac(f,(1,2),dx=(1e-3,1e-3)))
26 print('\n')
27 #print(jac(f, np.array((1.0,2.0))))
<ipython-input-58-3e78218d0309> in jac(f, x0, dx)
21 J=np.zeros([N,N])
22 x[i]=x[i]+dx[i]
---> 23 J[:,i]=(f(x)-f0)/dx[i]
24 return J
25 print(jac(f,(1,2),dx=(1e-3,1e-3)))
TypeError: unsupported operand type(s) for -: 'float' and 'function'
TypeError回溯(最近一次调用)
在()
23 J[:,i]=(f(x)-f0)/dx[i]
24返回J
--->25打印(jac(f,(1,2),dx=(1e-3,1e-3)))
26打印(“\n”)
27#打印(jac(f,np.数组((1.0,2.0)))
单位为jac(f,x0,dx)
21 J=np.零([N,N])
22 x[i]=x[i]+dx[i]
--->23 J[:,i]=(f(x)-f0)/dx[i]
24返回J
25打印(jac(f,(1,2),dx=(1e-3,1e-3)))
TypeError:-:“float”和“function”的操作数类型不受支持
我不知道如何解决这个错误,也不知道它在说什么。如果您能帮助修复错误或我的代码,我们将不胜感激。您的代码中有一些地方出错:
是一个函数,而不是np数组f0
dx=np。至少对我来说没有意义
- 在每次迭代中将J设置为零矩阵
import numpy as np
f = lambda x: np.array([np.sin(x[0]) + 0.5 * (x[0] - x[1])**3 - 1.0, 0.5 * (x[1] - x[0])**3 + x[1]])
def jac(f,x0,dx=None):
x0 = np.atleast_1d(x0)
N = x0.size
J = np.zeros((N, N))
if dx is None:
dx=10^-5*np.ones(N)
else:
dx=np.atleast_1d(dx)
for i, ei in enumerate(np.eye(N)):
J[:,i] = (f(x0 + dx[i]*ei)-f(x0))/dx[i]
return J
顺便说一句,您可以使用scipy.optimize.\u numdiff中的undocumented函数。我将使用它来检查我们的实现:
from scipy.optimize._numdiff import approx_derivative
print(jac(f,(1,2),dx=(1e-6,1e-6)))
print(approx_derivative(f,(1,2)))
给我
[[ 2.04030038 -1.5000015 ]
[-1.4999985 2.5000015 ]]
[[ 2.04030231 -1.5 ]
[-1.5 2.5 ]]
变量f0应该是x0处函数值的副本,而不是函数本身的副本。将
f0=np.copy(f)
更改为f0=np.copy(f(x))