这两节我的代码给出了以下错误消息。
def Simpsons(a, b, n, f, x):
h=(b-a)/n
s = 0.
step = a + h
for i in range(1, int(n/2)):
s += 4*f(x)
#step += 2*h
step = a + 2 * h
for i in range(2, int(n/2 - 1)):
s += 2*f(x)
#step += 2 * h
area = (h/3) * (f(a) + f(b) + s)
return area
和
for i in range(0, len(list_n)):
for j in range(0, len(Functions)):
x = np.linspace(a, b, list_n[i])
error_simp[j, i] = Exact_intergrals[j] - Simpsons(0, 1, list_n[i], Functions[j], x)
print(error_simp)
发出此信息:
error_simp[j, i] = Exact_intergrals[j] - Simpsons(0, 1, list_n[i], Functions[j], x)
ValueError: setting an array element with a sequence.
这是为什么?我尝试的一切都没有摆脱它。
答案 0 :(得分:0)
我猜你试图将数组加载到error_simp [j,i]中,它可能只能包含浮点数。
这是一个简单的例子,说明了这个错误:
import numpy
b = numpy.zeros(5)
b[0] = numpy.zeros(5) - 1
产生相同的错误。
看起来Simpsons
函数返回数组或Exact_intergrals[j]
包含数组。
如果您需要在error_simp
矩阵中保存数组,请尝试再添加一个维度:
error_simp = np.zeros((rows, cols, additional_dimension_size))
(另一种选择是在构造函数中显式设置dtype=object
选项,但速度要慢得多,不推荐使用。)
答案 1 :(得分:0)
给定一个数组时,你的辛普森一家的函数返回一个相同大小的数组:
In [335]: Simpsons(0,1,10, lambda x:x**2, np.linspace(0,1,3))
Out[335]: array([ 0.03333333, 0.2 , 0.7 ])
您没有显示error_simp
的初始化方式。使用error_simp[j, i]=...
和错误表明
np.zeros((n,m), float)
或类似的东西。
要获得进一步的帮助,您需要指定您希望放在error_simp
中的内容。如果x
对于所有元素都相同,则可以创建匹配的3d数组。如果x
的长度不同,则必须为dtype=object
。但我喜欢不鼓励初学者使用这种用法。这样的数组只不过是一个美化(或贬低)列表的列表。对于使用这种阵列可以做什么,很容易产生不切实际的期望。
======
仔细查看
for i in range(0, len(list_n)):
for j in range(0, len(Functions)):
x = np.linspace(a, b, list_n[i])
您可能正在创建不同的尺寸x
。您没有显示list_n
,但它可能类似于[10,12,14,...]
,为不同的n
测试此函数。