2017-04-06 4 views
1

Ich schreibe gerade ein Programm, das ein Polynom grafisch darstellt und den Bereich unter der Kurve zwischen zwei Endpunkten mit der 3/8-Regel von Simpson schattiert und dann diese Information auf dem Graphen ausgibt. Gegenwärtig arbeitet das Programm richtig für ein Polynom ("(x - 3) * (x - 5) * (x - 7) + 85") zwischen zwei Endpunkten (2 und 9). Wenn das Programm jedoch eine Eingabe für entweder das Polynom oder einen der beiden Endpunkte mit dem Eingabebefehl akzeptiert, wird das Programm eingefroren und stürzt ab, ohne ein Diagramm zu erstellen. Dies geschieht auch, wenn die aktuellen Nummern erneut eingegeben werden. Unten ist der Code:Python-Programm friert ein und schließt beim Eingeben einer Eingabe?

Hier ist die Basis des Codes

import numpy as np 
import matplotlib.pyplot as plt 
from matplotlib.patches import Polygon 

Hier I das Polynom definieren func (x)

def func(x): 
    return (x - 3) * (x - 5) * (x - 7) + 85 

hier zu definiere ich die Funktion, mit der die Berechnung Bereich unter der Kurve mit Simpson-Regel

Hier definiere ich die Endpunkte zwischen denen zu integ

Rate
a, b = 2, 9 # integral limits 

Hier sind ein paar weitere Definitionen für Bequemlichkeit

x = np.linspace(0, 10) #Generates 100 points evenly spaced between 0 and 10 
y = func(x) #Just defines y to be f(x) so its ez later on 

fig, ax = plt.subplots() 
plt.plot(x, y, 'r', linewidth=2) 
plt.ylim(ymin=0) 

final_integral = simpson(lambda t:func(t), a, b, 100000) 

Hier habe ich den schraffierten Bereich konstruieren

# Make the shaded region 
ix = np.linspace(a, b) 
iy = func(ix) 
verts = [(a, 0)] + list(zip(ix, iy)) + [(b, 0)] 
poly = Polygon(verts, facecolor='0.9', edgecolor='0.5') 
ax.add_patch(poly) 

Hier habe ich die integrale Notation in der Grafik drucken

plt.text(0.5 * (a + b), 30, r"$\int_a^b f(x)\mathrm{d}x$", 
    horizontalalignment='center', fontsize=20) 

Hier drucke ich die Fläche unter der Kurve berechnet, indem die simpson 3/8ths Regel auf dem Graphen

ax.text(0.25, 135, r"Using Simpson's 3/8ths rule, the area under the curve is: ", fontsize=20) #r denotes a raw string 
ax.text(0.25, 114, final_integral , fontsize=20) #prints the value of the 
integral defined using simpson's 3/8ths prior 

Hier fertig Konstruieren ich die Grafik

plt.figtext(0.9, 0.05, '$x$') 
plt.figtext(0.1, 0.9, '$y$') 

ax.spines['right'].set_visible(False) #no dashes on axis 
ax.spines['top'].set_visible(False) 
ax.xaxis.set_ticks_position('bottom') 

ax.set_xticks((a, b)) 
ax.set_xticklabels(('$a$', '$b$')) 
ax.set_yticks([]) 

plt.show() 

Doch wenn ich die Zeile, wo die Endpunkte gelesen werden definiert 'a, b = int (Eingabe ("gebe deine Endpunkte im Format 2,9 ein")) # integral limits', das Programm errors out as shown.

Jede Hilfe wäre willkommen. Ich bemühe mich, das Dilemma zu verstehen, also appoligiere ich, dass ich keine weiteren Informationen zur Verfügung stelle.

Antwort

1

Das ist ein Fehler im Laufzeit-System, in dem es keine Fehlermeldung gibt. Ein Absturz ist selten eine akzeptable Antwort.

Ich vermute, dass die unmittelbare Ursache ist Ihre ungültige Eingabe Konvertierung: int nimmt ein String-Argument mit einer einzigen ganzen Zahl dargestellt. Wenn Sie versuchen, dies zu zwei Variablen zuweisen, sollten Sie erhalten eine Nachricht, die Ihnen sagen, dass nicht genügend Werte zu entpacken sind ... aber zuerst erhalten Sie einen ValueError für den Versuch, eine Zeichenfolge wie "2,9" in eine einzelne ganze Zahl.

Versuchen Sie diese statt:

str_in = input("enter your endpoints in the format 2,9") # integral limits 
fields = str_in.split(',') 
a, b = [int(i) for i in fields] 

Sie können Fehlerprüfung oder kollabieren diese zu einer einzigen Zeile hinzufügen - aber ich erwarte, dass Sie jetzt die benötigte Verarbeitung sehen.

Verwandte Themen