Berechnung der niedrigsten monatlichen Zahlung mit bidirektionalen Suche in python
Ich versuche zu berechnen, die minimale monatliche Zahlung zu zahlen sich aus ein Darlehen mit den folgenden:
balance = 999999
annualInterestRate = .18
monthlyInterestRate = annualInterestRate/12
balanceCOPY = balance
#Bisection search parameters
lo = balance/12
hi = (balance*(1+monthlyInterestRate**12))/12
epsilon = .01
guess = (lo + hi)/2
while True:
for month in range(1,13):
balance = balance - guess
balance = balance + (monthlyInterestRate*balance)
if balance > 0 and balance > epsilon:
lo = guess
balance = balanceCOPY
elif balance < 0 and balance < -epsilon:
hi = guess
balance = balanceCOPY
else:
print('Lowest payment: ',str(round(guess,2)))
break
guess = (lo + hi)/2
Allerdings scheine ich zu sein stecken in einer Art endlos-Schleife, wo mein guess
variable wird nicht aktualisiert. Wie kann ich ausbrechen aus der Endlosschleife und habe meine guess
variable aktualisiert?
Das problem war in meinem Mathe. Ich wollte sagen,
hi = (balance*(1+monthlyInterestRate)**12)/12
Danke für all die Hilfe, jeder!
- Was ist Ihre Frage? (Und "+1 für SSCCE").
- Haben Sie versucht, Druck aus allen Variablen, die während jeder iteration der Schleife und sehen, ob einer von Ihnen nicht aktualisiert werden? Auch, wo sind Sie immer diese Algorithmus aus?
- Wissen Sie, es gibt Formeln für diese, richtig? en.wikipedia.org/wiki/Compound_interest#Simplified_calculation
- Das sieht aus wie eine Lern-übung, bei der OP soll der Praxis bidirektionalen Suche. Immer die tatsächliche Höhe der Zinsen einfach ist wahrscheinlich nicht so wichtig.
- versuchen Sie es mit diesem .. diese Arbeit für mich. http://stackoverflow.com/a/39734567/4356266
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erste von allen,, wenn Sie tun, MITx übung und Abschluss der vorherigen test (nur einer Schrittweite von 10 in raten) du bist ein kleiner Schritt, um es zu bekommen. Müssen nur einige Anpassungen vornehmen, während der Zustand und die Kontrolle über die jährlichen Ergebnisse.
Über bidirektionalen Suche, werde ich versuchen zu klären, das Konzept. Sie haben immer zwei enden, das minimum und das maximum. Und immer raten, die von der Mitte der Extremitäten.
Nachdem die erste Vermutung, benötigen Sie zum anpassen der Extremitäten aufgrund der jährlichen Ergebnisse. Wenn nach einem Jahr die Zahlung der Mindestbetrag für die Getränke, Mädchen, Programm, Bücher und andere Dinge, die Sie nicht bezahlen die Gesamtbilanz, Sicherheit müssen erhöhen Sie das minimale. Sonst, Wenn, zum Beispiel, Sie bezahlt die Bilanzsumme im 10ten Monat, werden Sie brauchen, um zu trinken mehr und treffen Sie auf neue Mädchen im nächsten Jahr!!! nur ein Scherz... Sie tun müssen, verringern Sie die minimale. Dies ist die Prüfung, die Sie tun müssen, nachdem Sie abgeschlossen von einem Jahr harter Zahlungen
In der übung haben wir:
Die erste Vermutung sein wird (minimum + maximum) /2, die ich genannt guessMinimum so:
So beginnen Sie mit der ersten Vermutung (guessMinimum). Nach einem Jahr werden Sie überprüfen Sie die bleiben.
Wenn die weiterhin negativ ist, bedeutet, dass Sie zu viel bezahlt haben. Sie müssen die Verringerung der monatlichen Zahlung. Otherside, wenn nach einem Monat das bleiben positiv (für Beispiel, mehr als Ihre Genauigkeit (ex. 0.10)), müssen Sie verringern die monatliche Zahlung, okay?!
Versuchen, um design-denken.....
Wenn nach einem Jahr, das "bleiben" ist negativ (zum Beispiel). Bedeutet, dass die 'guessMinimum' ist zu viel!!! Sie müssen... nicht Sie, das PROGRAMM!!!!! Das Programm angepasst werden muss, geringer ist das minimum, damit......
Sorry, Jungs. Ich habe versucht, ein Bild einzufügen, sondern als ein neues Mitglied. Ich konnte es nicht. müssen mindestens 10 Ruf.... helfen Sie mir!!!! zu viel Arbeit mit Zeichen!!!!
Ist und der CODE müssen diese harte Arbeit zum einstellen der Mindest-bis zum 'bleiben' ist akzeptabel (innerhalb Ihrer Präzision, oder epsilon, oder einen beliebigen Buchstaben oder eine variable oder.. okay. 🙂
Nach dem Verständnis, das Konzept und die Zeichnungen.. lasst uns mal den CODE.
Das ist es.
Ich glaube, diese Lösung sollte funktionieren,
Herauszufinden, bugs wie diese, eine gute Möglichkeit ist es nur, um etwas zu drucken, zum Beispiel, habe ich den folgenden code:
Dann sehen, was passiert, und Sie herausfinden können, was Los ist. Wie es sich herausstellt:
berechnet eine Obere Schranke, die ist zu niedrig. Vielleicht haben Sie gedacht:
Änderte ich den code dieses:
Ein paar Anmerkungen:
Ich änderte "hi" und "lo" auf "high" und "low". Es ist besser, nicht zu kürzen, Variablen-Namen, da abgeschnitten, Variablen-Namen sind weniger lesbar.
Ich Hinzugefügt debug-Anweisungen zeigen die Werte der verschiedenen Variablen.
Hier war das Ergebnis der Ausführung der oben:
Daraus können Sie sehen, dass Ihre niedrigen Wert zu konvergieren, um Ihren hohen Wert. In anderen Worten, Ihre erste hohe Wert ist nicht hoch genug. Sobald Sie sind, Sie gleichen Wert, wird die Schleife nie etwas ändern und wird immer weiter.
Ich denke, diese Zeile:
Lesen sollte:
da ich denke, Sie wollen balance zwischen
0
und-epsilon
eher als weniger als-epsilon
Auch, wie @WinstonEwert beachten:
sollte
elif balance < 0 and balance < -epsilon:
. Jetzt bist du prüfen, ob balance ist weniger als 0 und kleiner als -0.01. Beachten Sie, dass -100000000000 passt, dass die Kriterien.Hier ist was ich kam mit, das funktioniert. Ich normalerweise schreiben Sie Funktionen für diese Art von Dingen, so dass es wieder verwendet werden kann, auch wenn ich nicht an, weil er mich in die Gewohnheit, es zu tun, und gibt mir ein paar zusätzliche Praxis mit Ihnen.
Python 3 Antwort: