用Python实现差分(非微分)方程

2024-06-12 08:02:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python实现一个差分方程。它们的形式是yn+1=a*yn+b,给定y0,其中y0是初始值,它迭代——意思是

y1=a*y0+b,
y2=a*y1+b,
... 你知道吗

一个例子问题(来自我的微积分课)是这样的:假设你贷款6万美元,计划每月还700美元,利率为1.2%。5年后还能剩下多少?这将设置为yn+1=1.1*yn-700,y0=60000

我理解Python中的递归,比如说

i = 0
while i < 20:
    i = i+1

但是当下一次迭代需要上一次迭代的值时,我不确定如何处理它。你知道吗


Tags: 差分形式计划例子方程微积分yn利率
3条回答

任务的常规循环如下所示:

loan = 60000
annualinterest = 1.2/100
monthlyinterest = annualinterest/12
monthlyfactor = 1+monthlyinterest
monthlypackback = 700

for month in range(5*12):
    loan = loan * monthlyfactor - monthlypackback
    print(month+1, "{0:.2f}".format(loan))

注意,monthlyinterest的讨论可能有几个原因,这些原因不是特定于编程的:

a)这可能取决于利息的计算时间,即每月的哪一天。可能在付款之前或之后。你知道吗

b)年利率除以12对银行来说更好。也可以计算为1.012的第12根。你知道吗

现在,上面是一个直接的循环。它与递归无关。但它可以转换为递归调用:

def recursive(loan, annualinterestPercentage, monthlyPayback, months):
    if months == 0:
        return loan
    annualinterest = annualinterestPercentage / 100
    monthlyinterest = annualinterest / 12
    monthlyfactor = 1 + monthlyinterest
    return recursive(loan * monthlyfactor - monthlyPayback, annualinterestPercentage, monthlyPayback, months - 1)

关键是:

a)递归调用需要一个退出条件。我一开始就说对了。这里的退出条件是剩余月份达到0。你知道吗

b)函数recursive()调用自身,希望使用一个接近退出条件的参数。这里是month-1。你知道吗

你这样称呼它:

print(recursive(60000, 1.2, 700, 60))

通常,您可以通过存储一个带有计算最后一个值的变量,并使用起始值对其进行种子设定来实现这一点。例如:

y = 60000
while True:
    y = .1 * y - 700

当然,您必须确定何时停止以及如何处理这些值。您当然要打印它们:

y = 60000
while True:
    y = .1 * y - 700
    print(y)

但你可能只想做100次,而不是永远:

y = 60000
for i in range(12*5):
    y = .1 * y - 700
    print("%d: %f" % (i,y))

您可能还想存储它们以备以后使用,因此请将它们放入一个数组中:

y = 60000
results=[]
for i in range(12*5):
    y = .1 * y - 700
    results.append(y)

print(results)
def calc1():
    S=60000
    x=0.012
    y=5*12
    Pmt=700
    r=1+(x/12)
    Ln = S
    for k in range(1, y+1):
         Ln=(Ln*r)-Pmt
    print (Ln)

结果:20444.98美元

或者使用定义为sum of geometric progression的代数

Ln=S*ry-Pmt*((1-ry)/(1-r))=20444.98美元

抱歉,MathJax不支持Stackoverflow。你知道吗

相关问题 更多 >