Code übermitteln

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
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Ich finde die Stelle nicht, wo man einen Code eingeben kann.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

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')

hubgra
User
Beiträge: 53
Registriert: Donnerstag 20. Juli 2023, 17:20

Das ist der Code, das Ergebnis ist doch ganz hübsch.
Wie kann ich das als Video speichern?
Meine Fragege vom 2.8. hat sich erledigt, es ging ja ganz leicht.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.

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()
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:

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)
    )
Antworten