首先,提前感谢您接受我对Python的初学者理解。我来自MATLAB,希望这能提供一些背景知识
在MATLAB中,我将数学函数定义为:
f =@ (x) 2*x(1)^2 + 4*x(2)^3
在Python中,我写道:
def f(x):
return 2*x(1)**2 + 4*x(2)**3
但我的另一个函数(创建梯度向量的有限差分法)中有一个错误:
line 9, in f
return 2*x(1)**2 + 4*x(2)**3
TypeError: 'numpy.ndarray' object is not callable
(包含n个条目的输入X1,由原始方程中的变量数量指定,反馈到函数f(x)中,以在特定点进行计算)
更新2021-10-22 下面我已经包含了代码以供参考此代码当前有效。
我想知道的主要事情是,我如何为一个方程创建任意数量的变量,就像我在MATLAB中使用x(1),x(2)…x(n)所做的那样。有人告诉我应该使用def f(*x)
,但是当我在f(x)上添加“*”操作符时,我得到了一个tuple index out of range
错误
import math, numpy as np
def gradFD(var_init,fun,hx):
df = np.zeros((len(var_init),1)) #create column vector for gradient output
# Loops each dimension of the objective function
for i in range(0,len(var_init)):
x1 = np.zeros(len(var_init)) #initialize x1 vector
x2 = np.zeros(len(var_init))
x1[i] = var_init[i] - hx
x2[i] = var_init[i] + hx
z1 = fun(x1)
z2 = fun(x2)
# Calculate Slope
df[[i],[0]] = (z2 - z1)/(2*hx)
# Outputs:
c = df #gradient column vector
return c
和测试脚本:
import math
import numpy as np
from gradFD import gradFD
def f(x):
return 2*x[0]**2 + 4*x[1]**3 #THIS IS THE NOW WORKING CODE
#return 2*x**2 + 4*y**3
var_init = [1,1] #point to evaluate equation at
c = gradFD(var_init,f,1e-3)
print(c)
Python中的数组索引是用方括号而不是圆括号完成的。请记住,Python从索引0开始,而不是1
您的函数被调用
f
,但您正试图调用x(2)
。出现错误是因为您试图将x
作为函数调用,但x
是一个numpy数组相关问题 更多 >
编程相关推荐