Code übermitteln
Es gibt einen dicken Knopf "Vollstaendiger Editor & Vorschau", und den kannst du druecken. Und da gibt es einen Knopf, </>. Wenn du einkopierten Code markiert hast, und dann den Knopf drueckst, umfasst der den mit den Code tags. Oder du gibst die einfach selbst ein:
[code*]
def der_code():
[/code*]
ACHTUNG: OHNE DIE *!!!!! Die sind hier nur drin, damit eben genau NICHT der Code-Tag greift, sondern das ganze illustriert werden kann.
[code*]
def der_code():
[/code*]
ACHTUNG: OHNE DIE *!!!!! Die sind hier nur drin, damit eben genau NICHT der Code-Tag greift, sondern das ganze illustriert werden kann.
Code: Alles auswählen
import matplotlib.pyplot as plt
import numpy as np
def pkt(A, lw, c):
for i in range(len(A)):
plt.plot(A[i][0], A[i][1], color = c, marker = 'o', markersize = 3*lw)
def gls(a, A):
b = []
for i in range(len(A)):
b.append(A[i][1])
x = np.linalg.solve(a,b)
return x
def zeichne(A,lw, c):
a0 = []
for i in range(len(A)):
a0.append(A[i][0])
a = np.vander(a0, increasing = True)
if np.linalg.det(a) == 0:
print('singuläre Matrix, übersprungen')
return
x = gls(a, A)
t = np.linspace(-20,20,300)
y = 0
for i in range(len(A)):
y += x[i]*t**i
pkt(A, lw, c)
plt.plot(t,y, linewidth=lw, color = c)
A = [[-5,-2], [1,2], [2,5], [-3,-2], [-1,5], [3,2], [4,-2]]
B = [[1,-2], [2,-5], [3,2], [4,5], [5,2]]
def kurve(A,B,b,r):
plt.xlim(-10, 10)
plt.ylim(-30, 30)
v = -5
while v < 5:
zeichne(A, 1, b)
zeichne(B, 1, r)
plt.pause(0.2)
zeichne(A, 5, 'white')
zeichne(B, 5, 'white')
A[0][0] += 0.1
B[-1][0] -= 0.11
v += 0.1
zeichne(A, 1, b)
zeichne(B, 1, r)
plt.show()
kurve(A,B,'blue','red')
Wenn man in Python über einen Index iteriert, dann macht man was falsch, vor allem, wenn man schon numpy benutzt, wo man alles bequem per Vektoren rechnen kann.
Statt jeden Punkt einzeln zu Plotten sollte man alle auf einmal plotten.
Wie schon geschrieben, wertet man Polynome mit polyval aus.
Statt mit weiß über die Kurven drüberzumalen sollte man die Kurven, die man nicht mehr braucht einfach löschen, denn so zeichnest Du mit jedem Schritt vier Kurven mehr.
Und wie ich schon vor ein paar Tagen geschrieben hatte, benutzt man zum Fitten von Polynome an Punkte polyfit. Damit vereinfacht sich der Code enorm:
Statt jeden Punkt einzeln zu Plotten sollte man alle auf einmal plotten.
Wie schon geschrieben, wertet man Polynome mit polyval aus.
Statt mit weiß über die Kurven drüberzumalen sollte man die Kurven, die man nicht mehr braucht einfach löschen, denn so zeichnest Du mit jedem Schritt vier Kurven mehr.
Code: Alles auswählen
import matplotlib.pyplot as plt
import numpy as np
def pkt(points, line_width, color):
return plt.plot(points[:, 0], points[:, 1], linewidth=0, color=color, marker='o', markersize=3*line_width)
def gls(a, b):
x = np.linalg.solve(a, b)
return x
def zeichne(A, linewidth, color):
A = np.array(A)
a0 = A[:, 0]
a = np.vander(a0, increasing=True)
if np.linalg.det(a) == 0:
print('singuläre Matrix, übersprungen')
return []
x = gls(a, A[:, 1])
t = np.linspace(-20,20,300)
y = np.polyval(x[::-1], t)
return (
pkt(A, linewidth, color)
+ plt.plot(t, y, linewidth=linewidth, color=color)
)
def kurve(A, B, b, r):
plt.xlim(-10, 10)
plt.ylim(-30, 30)
for v in np.linspace(-5, 5, 100, endpoint=False):
plots = (
zeichne(A, 1, b)
+ zeichne(B, 1, r)
)
plt.pause(0.2)
for p in plots:
p.remove()
A[0][0] += 0.1
B[-1][0] -= 0.11
zeichne(A, 1, b)
zeichne(B, 1, r)
plt.show()
def main():
A = [[-5,-2], [1,2], [2,5], [-3,-2], [-1,5], [3,2], [4,-2]]
B = [[1,-2], [2,-5], [3,2], [4,5], [5,2]]
kurve(A, B, 'blue', 'red')
if __name__ == "__main__":
main()
Code: Alles auswählen
def zeichne(A, linewidth, color):
A = np.array(A)
x = np.polyfit(A[:,0], A[:, 1], len(A) - 1)
t = np.linspace(-20, 20, 300)
y = np.polyval(x, t)
return (
plt.plot(A[:, 0], A[:, 1], linewidth=0, color=color, marker='o', markersize=3*line_width)
+ plt.plot(t, y, linewidth=linewidth, color=color)
)