【发布时间】:2020-06-04 12:36:29
【问题描述】:
更新:
u_n = u[n,:].copy() 解决了这个问题。谢谢大家提出宝贵的建议。建议修复的答案已标记。
我有一个生成两个数组的代码:
u_n = [0.00000000e+00 -3.55754723e-04 -5.83161988e-04 -7.28203241e-04
-8.20386731e-04 -8.78649151e-04 -9.15142981e-04 -9.37666984e-04
-9.51225955e-04 -9.59031686e-04 -9.63145318e-04 -9.64889573e-04
-9.65113299e-04 -9.64361236e-04 -9.62982969e-04 -9.61202840e-04...]
u = [ 0.00000000e+00 -5.71470888e-04 -9.86586605e-04 -1.28338884e-03
-1.49272978e-03 -1.63854091e-03 -1.73883197e-03 -1.80686241e-03
-1.85223351e-03 -1.88180768e-03 -1.90043862e-03 -1.91152978e-03
-1.91745053e-03 -1.91984028e-03 -1.91982739e-03 -1.91818493e-03
-1.91544043e-03 -1.91195258e-03 -1.90796453e-03 -1.90364059e-03...]
我正在使用np.subtract 减去这两个数组(也尝试减去像u-u_n 这样的单个元素)。 Python 正在计算(不仅仅是打印)每个元素的结果为 0!这影响了我的代码的收敛性。
如何正确使用算术?提前致谢。
编辑:
非零结果是预期的,因为两个数组的元素之间存在一些差异。
然而,Python 会为 np.subtract(u-u_n) 返回 [0,0,0,0,......,0]。我的代码如下。
# Compute b and solve linear system
print(u_n)
for i in range(1, Nx, 1):
b[i] = u_n[i]-(k*np.cos(t[n])*(L-x[i]))/L
b[0] = 0; b[Nx] = 0
u[n,:] = scipy.sparse.linalg.spsolve(A, b)
u[n,0] = 0; u[n,Nx] = 0
print(u[n,:])
R = np.subtract(u[n,:],u_n)/k
print(R)
R = R**2
R2 = np.sum(R)
R2 = np.sqrt(R2)
print ('R2 = %.9f' %R2)
#Update u_n before next step
u_n = u[n,:]
输出:
u_n = [ 0.00000000e+00 -3.55754723e-04 -5.83161988e-04 -7.28203241e-04
-8.20386731e-04 -8.78649151e-04 -9.15142981e-04 -9.37666984e-04
-9.51225955e-04 -9.59031686e-04 -9.63145318e-04 -9.64889573e-04
-9.65113299e-04 -9.64361236e-04 -9.62982969e-04 -9.61202840e-04
-9.59164819e-04 -9.56961297e-04 -9.54651567e-04 -9.52273679e-04....]
u = [ 0.00000000e+00 -5.71470888e-04 -9.86586605e-04 -1.28338884e-03
-1.49272978e-03 -1.63854091e-03 -1.73883197e-03 -1.80686241e-03
-1.85223351e-03 -1.88180768e-03 -1.90043862e-03 -1.91152978e-03
-1.91745053e-03 -1.91984028e-03 -1.91982739e-03 -1.91818493e-03
-1.91544043e-03 -1.91195258e-03 -1.90796453e-03 -1.90364059e-03...]
# R = u - u_n
R = [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. ....]
【问题讨论】:
-
嗨,你想达到什么目的?预期的结果是什么?你用了什么代码?请提供 MRE (stackoverflow.com/help/minimal-reproducible-example)
-
你能提供一个关于你有什么问题的代码 sn-p 吗?
-
@YasserMohsen 对于我的 coed,输出 R = u-u_n,不应该是 0,但这就是 Python 生成的。
-
在调用
np.subtract之前尝试打印u[n,:]和u_n。这些变量可能在内存中存在别名 -
所以只是为了确保 - 您正在迭代解决一个问题,即您的 R 是新 (
u[n,:]) 和前一个 (u_n) 步骤之间的差异。除了@tstanisl 的建议之外,您的初始条件是什么?u_n你是从哪个开始的?
标签: python numpy floating-point