因此,我尝试使用欧拉方法绘制方程的近似值,并且它起作用了,唯一的问题是,当我使用符号绘制{时,该图显示了从第一个点到最后一个点的对角线{1}},该行不见了,但我需要连续的行。
'<'
运行下一个图时,会出现对角线
from decimal import *
#The Decimals are so that x is precise
from matplotlib import pyplot as pyplot
#Creates a range but with floats
def rangoFloat(m,maximo,cre):
minimo=Decimal(m)
n=str(cre)
while minimo <= maximo:
yield float(minimo)
minimo += Decimal(n)
#Substracs xn and delta
def ant(xn,delta):
return (float(Decimal(xn)-Decimal(delta)))
#Main function
def Teuler(x0,y0,A,B,cre=0.1,limite=20,delta=5,arr=([],[])):
y1=float(y0)
arr[0].append(x0)
arr[1].append(y0)
for i in rangoFloat(ant(x0,-cre),limite,cre):
arr[0].append(i)
y1=float(Decimal(y1) * (Decimal(1) + Decimal(cre) * Decimal(A) - Decimal(cre) * Decimal(B)))
arr[1].append(y1)
return arr
我正在使用python 3.7
答案 0 :(得分:1)
发生此问题是因为您使用可变类型作为默认参数(([],[])
)。发生的情况是,每个新函数Teuler
调用都重复使用相同的数组。您可以通过在print
的开头添加Teuler
语句来看到它:
print('arr length: ', len(arr[0]), len(arr[0]))
调用后:
t1=Teuler(0, 1, 0.1, 0.16524,0.1,240)
t01 = Teuler(0, 1, 0.1, 0.16524,0.1,240)
t001=Teuler(0, 1, 0.1, 0.16524,0.01,240)
t0005= Teuler(0, 1, 0.1, 0.16524,0.0005,240)
arr length: 0 0
arr length: 2400 2400
arr length: 4800 4800
arr length: 28800 28800
因此,您的t...
数组从多次开始,这就是对角线的证明。
您需要做的是是将可变类显式传递为参数,还是更改代码以防止数组重用,例如:
#Main function
def Teuler(x0,y0,A,B,cre=0.1,limite=20,delta=5,arr=None):
if arr is None:
arr = ([],[])
如需进一步阅读,可以推荐Python Anti-Patterns