Реализация разностных (НЕ дифференциальных) уравнений в Python - PullRequest
2 голосов
/ 22 декабря 2019

Я пытаюсь реализовать разностное уравнение в Python. Они принимают форму y n + 1 = a * y n + b, учитывая y 0 , где y 0 - начальное значение иэто повторяется - значение

y 1 = a * y 0 + b,
y 2 = a * y 1 + b,
...

Примерная проблема (из моего класса исчисления) будет такой: Скажем, вы берете кредит на сумму 60 000 долларов США. и планируют выплатить 700 долларов в месяц назад по процентной ставке в 1,2%. Сколько осталось бы через 5 лет? Это будет установлено как y n + 1 = 1.1 * y n - 700, y 0 = 60,000

Я понимаю рекурсию в Python в том смысле, что вы можете сказать, например,

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

, но я не уверен, как подойти к ней, когда для следующей итерации требуется значение изпредыдущий.

Ответы [ 4 ]

1 голос
/ 22 декабря 2019
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

Или с использованием алгебры с определением сумма геометрической прогрессии

Ln = S * r y -Pmt * ((1-r y ) / (1-r)) = $ 20444,98

Извините, Stackoverflow не поддерживается MathJax.

1 голос
/ 22 декабря 2019

Обычно вы делаете это, сохраняя одну переменную с последним значением из расчета, и заполняя ее начальным значением. EG:

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 голосов
/ 22 декабря 2019

Код

Использование рекурсии, как вы просили:

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
0 голосов
/ 22 декабря 2019

Обычный цикл для вашей задачи будет выглядеть следующим образом:

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) itможет зависеть от того, когда начисляются проценты, т.е. в какой день месяца. Это может быть до или после платежа.

b) деление годовой ставки на 12 лучше для банков. Он также может быть рассчитан как 12-й корень из 1.012.

Теперь выше приведен прямой цикл. Это не имеет ничего общего с рекурсией. Но его можно преобразовать в рекурсивный вызов:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...