【问题标题】:Implementing difference (NOT differential) equations in Python在 Python 中实现差分(非微分)方程
【发布时间】:2019-12-21 22:36:51
【问题描述】:

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

y1 = a * y0 + b,
y2 = a * y1 + b,
...

一个示例问题(来自我的微积分课)如下: 假设您借了 60,000 美元的贷款,并计划以 1.2% 的利率每月偿还 700 美元。 5 年后还剩多少? 这将设置为 yn+1 = 1.1 * yn - 700, y0 = 60,000

我理解 Python 中的递归,例如,您可以说,

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

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

【问题讨论】:

  • 我不太明白这个问题,因为你给出的例子几乎就是答案。您可以简单地将i = i+1 替换为i = 1.2*i - 700,不是吗?
  • 您的示例是循环,而不是递归。尽管该循环应该是问题的解决方案(如上所述)
  • while 循环不是递归。递归是一个调用自身的函数。
  • @Mathime:如果您的月供为 700,则需要将 1.2% 的年利率分成 12 份
  • @yW0K5o 没研究过,但我会研究一下

标签: python math finance


【解决方案1】:

通常,您会通过将计算中的最后一个值存储一个变量来执行此操作,并使用您的起始值对其进行播种。例如:

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)

【讨论】:

  • 这会产生积极的结果吗?这里的公式(0.1 因子)似乎不正确,请参阅我的评论或答案以获得解释。
【解决方案2】:
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

抱歉,Stackoverflow 不支持 MathJax。

【讨论】:

    【解决方案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))
    

    【讨论】:

      【解决方案4】:

      代码

      按照您的要求使用递归:

      def loan_calculator(y, payments, interest, monthly, period, counter=0, amount_left=[]):
        # y -> starting loan (60,000) 
        # payments -> paying $700/month
        # interest -> Interest rate on loan (yearly)
        # monthly -> boolean, if monthly or yearly
        # period -> how many years
        # counter -> number of payments made
        # amount_left -> after each payment how much is left to pay
      
        if monthly:
          period *= 12
          interest /= (12*100)
      
        # stopping condition:
        if counter == period:
          return y, amount_left
        else:
          y = (1+interest)*y - payments
          amount_left.append(y)
          counter += 1
          return loan_calculator(y, 700, 1.2, True, 5, counter)
      
      final_payment, all_payments = loan_calculator(6e4, 700, 1.2, True, 5)
      print(all_payments)
      print(final_payment)
      

      输出

      [59359.99999999999, 58719.359999999986, 58078.07935999998, 57436.15743935997, 56793.59359679933, 5615
      0.38719039612, 55506.53757758651, 54862.04411516409, 54216.90615927925, 53571.12306543852, 52924.6941
      88503956, 52277.618882692455, 51629.896501575146, 50981.52639807671, 50332.50792447478, 49682.8404323
      9925, 49032.52327283165, 48381.555796104476, 47729.937351900575, 47077.66728925247, 46424.74495654172
      , 45771.16970149826, 45116.94087119975, 44462.05781207095, 43806.51986988301, 43150.32638975289, 4249
      3.476716142635, 41835.970192858775, 41177.80616305163, 40518.98396921468, 39859.50295318389, 39199.36
      245613707, 38538.561818593196, 37877.100380411786, 37214.97748079219, 36552.192458272984, 35888.74465
      0731256, 35224.633395381985, 34559.858028777366, 33894.41788680614, 33228.31230469295, 32561.54061699
      7634, 31894.102157614627, 31225.996259772237, 30557.222256032004, 29887.779478288034, 29217.667257766
      32, 28546.884925024082, 27875.431809949103, 27203.30724175905, 26530.510549000803, 25857.0410595498, 
      25182.898100609345, 24508.080998709953, 23832.58907970866, 23156.421668788367, 22479.578090457155, 21
      802.057668547608, 21123.859726216153, 20444.983585942366] # This is a list of payments you owe each month                                           
      20444.983585942366 # This is your final payment
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-29
        • 2014-04-03
        • 1970-01-01
        • 2021-05-27
        • 2021-12-28
        相关资源
        最近更新 更多