Bisektion python

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
ashahzadi
User
Beiträge: 1
Registriert: Mittwoch 16. November 2022, 14:38

import matplotlib.pyplot as plt

x=[] # Hier konnen wir ein nummer geben Iteraionschritten
y=[] #f(c) Das ist Funktion werte und Losung
counter=0


while counter <=10: #Bei der While-Schleife in Python handelt es sich um eine Kontrollstruktur und counter ist fur listen zu finden.
counter +=1
temp_y = counter **2 #(Hier geben wir die funktionswerte)
x.append(counter) # Hier nehmen wir werte von x liste an
y.append(temp_y) # Hier nehmen wir werte von y liste an

plt.plot(x, y) # Plot erstellt Graph
plt.show() # Plot show zeigt das Graph an

def bisection(f): # Hier habe ich den Funkion bisektion definiert
flag = 1 #
while flag:
r = float(input('Bitte geben sie wert r in dem Intervall ein [r,s]:'))
s = float(input('Bitte geben sie wert s in dem Intervall ein [r,s]:'))
if f(r) * f(s) <= 0: # fr mit fs multiplizieren und das soll kleiner als null sein
flag = 0 # Hier prufen wir die Intervall
e = float(input('Bitte geben sie absoluten Fehler ein, Epsilon:')) # Epsilon ist ein absoluten fehler
step = 0
c = 0
if f(r) * f(s) == 0: # Hier erhalten wir die Losung
if not f(r):
c = r
else:
c = s
else:
c = (r + s) / 2
step += 1
print(f'step={step:3d} \t c ={c:0.7f}\t f(c)={f(c):0.7f} ')
while (abs(f(c)) > e): # Der Mittelpunkt C ist noch nicht kleiner als epsilon
step += 1
if f(c) * f(r) < 0: # Das bedeutet das zeigt jetzt die losung zwischen r und c
s = c # s ist gleich c
else: # im anderen fall
r = c # das bedeutet das zeigt die losung zwischen c und r
c = (r + s) / 2 # Hier haben wir den Mittelpunkt c
print(f'step={step:3d} \t c ={c:0.9f}\t f(c)={f(c):0.9f} ') # Hier haben wir das ausgabe von mittelpunkt c

return c, step


if __name__ == "__main__" :
f = eval(input('Bitte die lambda Funktion eingeben : z.b., lambda x: x+5 \n')) # Hier wir geben die lambda funktion um die ergebnisse zu aufrufen.
c, s = bisection(f) # Hier habe ich wieder den funktion bisection
print() # hier drucke ich einfach leere Zeile
print(f'Totalsteps={s}\tc ={c:0.9f}\tf(c)={f(c):0.9f}') # Ausgabe von ergebniss
from math import sinh, cosh
f = lambda a: a*cosh(50/a)-a-10 # putting x=50 in y(x)=a*cosh((x-x0)/a)-a+y0
a,_ = bisection(f) # using epsilon:=1e-8 and [r,s]=[125,127]
w=100
l=2*a*sinh(w/(2*a))
print("The length of rope:", f"{l:0.10f}")
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die code-tags (das ist der </>-Knopf im vollstaendigen Editor) benutzen, damit der Code lesbar bleibt, inklusive der in Python relevanten Einrueckungen.

Und was ist die Frage?
Sirius3
User
Beiträge: 18276
Registriert: Sonntag 21. Oktober 2012, 17:20

Die while-counter-Schleife ist eigentlich eine for-Schleife, bzw. ein einfache Listcomprehension:

Code: Alles auswählen

x = range(1,12)
y = [i ** 2 for i in x]
Der Code gehört aber scheinbar zu einem anderen Programm und gehört hier weg.

Für Flags gibt es True und False, statt 1 oder 0. Flags braucht man hier aber eigentlich gar nicht, weil man auch einfach eine while-True-Schleife per break verlassen könnte.
Benutze keine Einbuchstabigen Variablennamen, also left_border statt `r`, `right_border` statt `s`, `epsilon` statt `e`.

Die letzten Handvoll Zeilen sind falsch eingerückt. Die Zeilen unter `if-__name__` sollte aber eh in eine Funktion wandern, die üblicherweise `main` genannt wird.
Importe gehören an den Anfang der Datei.
Antworten