Seite 1 von 1

Code übermitteln

Verfasst: Montag 7. August 2023, 16:40
von hubgra
Ich finde die Stelle nicht, wo man einen Code eingeben kann.

Re: Code übermitteln

Verfasst: Montag 7. August 2023, 16:47
von __deets__
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.

Re: Code übermitteln

Verfasst: Montag 7. August 2023, 16:57
von hubgra

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


Re: Code übermitteln

Verfasst: Montag 7. August 2023, 17:00
von hubgra
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.

Re: Code übermitteln

Verfasst: Montag 7. August 2023, 19:34
von Sirius3
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)
    )