这是我在Python中作为数值方法的一部分使用的代码,但是当计算B[n]
并且它是小数时就会出现问题。例如,如果B[n] - f * B[n-1]
的答案是-2.6
,那么B[n]
就会变成-2
。当我在print
命令上执行(B[n] - f * B[n-1])
命令时,它输出-2.6
。
这太荒谬了,为什么会这样?B
的numpy
数组不接受小数作为其元素吗?如果是这样,在我看来,这绝对是荒谬的。顺便说一句,print
命令可以让我看到在for
循环期间实际发生了什么,我概述了上面的发现。
for n in range(1, nt):
f = A[n, n-1] / A[n-1, n-1]
A[n, n] = A[n, n] - f * A[n-1, n]
A[n, n-1] = 0
print(B[n], B[n-1], f,B[n] - f * B[n-1])
B[n] = B[n] - f * B[n-1]
print(A, B, f, B[n-1], B[n])
首先,问题需要包含一个最小的、可重复的例子;我们可以把它粘贴到Python中,它就会工作,不需要额外的定义。
对于这个问题,它可能看起来像这样:
import numpy as np
B = np.array([1, 1])
f = 3.6
print(B[1] - f * B[0]) # prints out -2.6
B[1] = B[1] - f * B[0]
print(B[1]) # prints out -2; I was expecting -2.6
我们可以将其粘贴到文件或Jupyter笔记本或Python命令行中并运行它;不需要额外的代码(或猜测)就可以看到问题的发生。
其次,NumPy数组(不像Python的其他部分)有一个定义的类型;对数组的单个元素赋值可转换类型。如果我们没有指定类型,NumPy会尝试根据数据进行猜测;这通常是令人满意的,但偶尔也会猜错。这里,因为B
中的两个初始值都是整数,所以它猜测我们希望B
包含整数类型。
两种解决方法:
帮助它猜对:
B = np.array([1.0, 1.0])
这是快速,简单和可移植的上下文,库甚至编程语言;它可以在任何地方工作,而不必查找如何指定类型。
告诉它我们想要什么:
B = np.array([1, 1], dtype=float)
如果数据来自程序中的其他地方,并且我们不能轻易更改它,这是唯一的方法;如果我们对类型很挑剔,比如我们想要更高(或更低)的精度;或者如果我们使用像
np.zeros
这样的函数,它不需要任何数据来猜测。