IndexError 试图在 python 中以数值方式求解差分方程
IndexError trying to solve difference equations numerically in python
我正在练习如何用数值方法求解差分方程,但我经常 运行 遇到如下问题。
谁能帮我解决这个问题?
import numpy as np
N = 10
#alternative 1
#x = np.zeros(N+1, int) # Produces error IndexError: index 11 is out of bounds for axis 0 with size 11
#alternative 2
x = (N+1)*[0] # Produces error: IndexError: list assignment index out of range
x[0] = 1000
r = 1.02
for n in range(1, N+1):
x[n+1] = r**(n+1)*x[0]
print(f"x[{n}] = {x[n+1]}")
您的数组长度为 11,这意味着最后一个元素由 x[10]
访问。但是在循环中,当 n 为 10 时调用的值是 x[11]
这使得它超出范围。
我不确定你的问题的限制,但如果你想访问 x[11]
,请将数组的总大小更改为 x = (N+2)*[0]
。
输出
x[1] = 1040.4
x[2] = 1061.208
x[3] = 1082.43216
x[4] = 1104.0808032
x[5] = 1126.1624192640002
x[6] = 1148.68566764928
x[7] = 1171.6593810022657
x[8] = 1195.092568622311
x[9] = 1218.9944199947574
x[10] = 1243.3743083946524
修复索引
您的索引范围与您在循环中使用它们的方式不一致。您可以使用以下两种可能的循环中的任何一种,但不要混合使用它们:
for n in range(1, N+1):
x[n] = r**n * x[0]
for n in range(0, N):
x[n+1] = r**(n+1) * x[0]
优化:乘法而不是求幂
请注意,计算指数 **
总是比计算乘法 *
更昂贵;您可以使用递归公式稍微优化您的代码:
for n in range(1, N+1):
x[n] = r * x[n-1]
for n in range(0, N):
x[n+1] = r * x[n]
使用库函数:itertools
、numpy
或 pandas
您要的是几何级数。 Python 提供了几种无需自己编写循环即可计算几何级数的方法。
- Documentation: numpy.geomspace
- Documentation: itertools.accumulate
- Question: Geometric progression using Python / Pandas / Numpy
- Question: python geometric sequence
- Question: Writing python code to calculate a Geometric progression
例如:
import itertools # accumulate, repeat
import operator # mul
def geometric_progression(x0, r, N):
return list(itertools.accumulate(itertools.repeat(r,N), operator.mul, initial=x0))
print(geometric_progression(1000, 1.2, 10))
# [1000, 1200.0, 1440.0, 1728.0, 2073.6, 2488.3199999999997, 2985.9839999999995, 3583.180799999999, 4299.816959999999, 5159.780351999999, 6191.736422399998]
我认为你的问题是你应该记住 list
中从 0 开始的任何元素的索引,最后一个元素的索引是 N - 1
其中 N
是 list
.
中元素的计数
因此,您应该在 for
循环中进行此更改:
for n in range(0, N):
此外,您对 print
的使用应该是对 list
中数据的反映。因此,您应该将 print
函数的参数固定为以下内容:
print(f"x[{n+1}] = {x[n+1]}")
进行这些更改后,您将得到以下结果:
x[1] = 1020.0
x[2] = 1040.4
x[3] = 1061.208
x[4] = 1082.43216
x[5] = 1104.0808032
x[6] = 1126.1624192640002
x[7] = 1148.68566764928
x[8] = 1171.6593810022657
x[9] = 1195.092568622311
x[10] = 1218.9944199947574
请注意,由于您的这行代码[=25],您的 list
中有 N + 1
个元素 而不是 N
个元素=]
x = (N+1)*[0]
希望对您有所帮助。
我正在练习如何用数值方法求解差分方程,但我经常 运行 遇到如下问题。
谁能帮我解决这个问题?
import numpy as np
N = 10
#alternative 1
#x = np.zeros(N+1, int) # Produces error IndexError: index 11 is out of bounds for axis 0 with size 11
#alternative 2
x = (N+1)*[0] # Produces error: IndexError: list assignment index out of range
x[0] = 1000
r = 1.02
for n in range(1, N+1):
x[n+1] = r**(n+1)*x[0]
print(f"x[{n}] = {x[n+1]}")
您的数组长度为 11,这意味着最后一个元素由 x[10]
访问。但是在循环中,当 n 为 10 时调用的值是 x[11]
这使得它超出范围。
我不确定你的问题的限制,但如果你想访问 x[11]
,请将数组的总大小更改为 x = (N+2)*[0]
。
输出
x[1] = 1040.4
x[2] = 1061.208
x[3] = 1082.43216
x[4] = 1104.0808032
x[5] = 1126.1624192640002
x[6] = 1148.68566764928
x[7] = 1171.6593810022657
x[8] = 1195.092568622311
x[9] = 1218.9944199947574
x[10] = 1243.3743083946524
修复索引
您的索引范围与您在循环中使用它们的方式不一致。您可以使用以下两种可能的循环中的任何一种,但不要混合使用它们:
for n in range(1, N+1):
x[n] = r**n * x[0]
for n in range(0, N):
x[n+1] = r**(n+1) * x[0]
优化:乘法而不是求幂
请注意,计算指数 **
总是比计算乘法 *
更昂贵;您可以使用递归公式稍微优化您的代码:
for n in range(1, N+1):
x[n] = r * x[n-1]
for n in range(0, N):
x[n+1] = r * x[n]
使用库函数:itertools
、numpy
或 pandas
您要的是几何级数。 Python 提供了几种无需自己编写循环即可计算几何级数的方法。
- Documentation: numpy.geomspace
- Documentation: itertools.accumulate
- Question: Geometric progression using Python / Pandas / Numpy
- Question: python geometric sequence
- Question: Writing python code to calculate a Geometric progression
例如:
import itertools # accumulate, repeat
import operator # mul
def geometric_progression(x0, r, N):
return list(itertools.accumulate(itertools.repeat(r,N), operator.mul, initial=x0))
print(geometric_progression(1000, 1.2, 10))
# [1000, 1200.0, 1440.0, 1728.0, 2073.6, 2488.3199999999997, 2985.9839999999995, 3583.180799999999, 4299.816959999999, 5159.780351999999, 6191.736422399998]
我认为你的问题是你应该记住 list
中从 0 开始的任何元素的索引,最后一个元素的索引是 N - 1
其中 N
是 list
.
中元素的计数
因此,您应该在 for
循环中进行此更改:
for n in range(0, N):
此外,您对 print
的使用应该是对 list
中数据的反映。因此,您应该将 print
函数的参数固定为以下内容:
print(f"x[{n+1}] = {x[n+1]}")
进行这些更改后,您将得到以下结果:
x[1] = 1020.0
x[2] = 1040.4
x[3] = 1061.208
x[4] = 1082.43216
x[5] = 1104.0808032
x[6] = 1126.1624192640002
x[7] = 1148.68566764928
x[8] = 1171.6593810022657
x[9] = 1195.092568622311
x[10] = 1218.9944199947574
请注意,由于您的这行代码[=25],您的 list
中有 N + 1
个元素 而不是 N
个元素=]
x = (N+1)*[0]
希望对您有所帮助。