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”的操作数类型不受支持

我不知道如何解决这个错误,也不知道它在说什么。如果您能帮助修复错误或我的代码,我们将不胜感激。

您的代码中有一些地方出错:

  • f0
    是一个函数,而不是np数组
  • 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))