Mathematische Formel bereitet Probleme

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
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

Folgende Formel: m = (1 - 1/(sinh(2/t)^4))^(1/8) für t>tc mit tc=2/arcsinh(1)

Code: Alles auswählen

import numpy as np
def m_unendlich(tau):
    """Berechnet den analytischen Wert der Magnetisierung 'm' im unendlichen 
    System."""
    tau_c = 2.0 / np.arcsinh(1)
    a = 1.0/np.sinh(2.0/tau)
    m = (1.0 - a**4.0)**0.125
    
    if tau.any() < tau_c:
        return  m
    elif tau_c <= tau.any():
        return 0.0

tau = np.linspace(0.0, 5.0, 200)
eigtl. soll sogar +m und -m bei tau < tau_c ausgegeben werden. Kann mir jemand helfen, das zu realisieren? Würde m_unendlich dann gern in abhängigkeit von tau plotten, aber vorher müssen die werte passen.
BlackJack

@alex2007: Was sind denn jetzt die Probleme? Ich denke Du hast die `any()`-Methode falsch verwanden. Und die `m_unendlich`-Funktion gibt entweder ein Array (`m`) oder einen einzelnen Wert (0.0) zurück. Das sieht mir auch reichlich komisch aus.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

@Blackjack:

also, ich möchte die Funktion: m_unendlich = ±(1 - 1/(sinh(2/t)^4))^(1/8) für t<t_c
m_unendlich = 0.0 für t>= t_c mit t_c= 2/arcsinh(1)
darstellen.
Ich dachte eben dass ich das über if Bedingungen löse und für den Plot 200 Werte für t benutze, die von 0 bis sagen wir 5 gehen.

Wie setz ich das am besten um?

Problem ist, dass es offensichtlich nicht so funktioniert, wie ich das möchte.

Habe eine umständliche Lösung, aber hätte es gern in Forn von einer einzigen Funktion m_unendlich(tau), welche ich über tau plotte und fertig.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Suchst du vielleicht numpy.piecewise?
Das Leben ist wie ein Tennisball.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

@EyDu: das sieht nach genau dem aus, was mir helfen könnte. Die Frage ist, ob dass dann mit den Dimensionen passt. Werd es morgen früh ausprobieren. Danke erstma.

Die Frage ist noch, wie ich das +- umsetze. Am besten ich schreibe die Funktion, die per piecewise die werte bzw. 0 ausgibt und zeichne einmal die Funktion und einmal die negative Funktion. Gibt's ne Möglichkeit zu jedem.Wert t, jeweils den positiven und negativen Wert m auszugeben und mit einmal zu plotten, ohne dass Python zwecks Dimension rumspeckert? Wäre halt am elegantesten, wenn man eine Funktion definiert und diese mit einem! Plotbefehl so zeichnet.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dich hindert ja nichts daran den Output der Funktion zweidimensional zu machen. Ist tau < tau_c dann lieferst du zu jedem tau [m, -m] zurück, andernfalls [0, 0]. Am Ende hast du dann eine 2xN-Matrix. Das ist zum Plotten schnell in zwei Arrays der Länge N zerlegt.

Oder halt der offensichtliche Weg: Alle ms für tau bestimmen und am ende ms und -ms plotten... :roll:
Das Leben ist wie ein Tennisball.
alex2007
User
Beiträge: 40
Registriert: Montag 14. April 2014, 10:08

Hab es jetzt so gelöst:

Code: Alles auswählen

def m_unendlich(tau, tau_c):
    """Berechnet den analytischen Wert der Magnetisierung 'm' im unendlichen 
    System."""
    a = 1.0/np.sinh(2.0/tau)
    m = (1.0 - a**4.0)**0.125
    return np.piecewise(tau, [tau < tau_c, tau >= tau_c], [m, 0.0])
    

tau_c = 2.0 / np.arcsinh(1)
tau = np.linspace(0.001, 5.0, 100)
Plotte dann einfach gleichfarbig m_unendlich und -m_unendlich. Danke für die Hilfe
Antworten