Hinweis auf die DSGVO: Auf unserer Seite werden keine Dritt-Anbieter-Cookies verwendet und nur Daten erfasst, welche für das Minimum an Board-Funktionalität notwendig sind.
Bevor Sie sich registrieren oder das Board verwenden, lesen Sie bitte zusätzlich die DSGVO-Erklärung, welche in der Navigationsleiste verlinkt ist.

Kurzfassung der unserer Meinung nach wichtigsten DSGVO-Punkte:
Es kann vorkommen, dass Benutzer eigenverantwortlich Videos oder sonstige Medien in ihren Beiträgen verlinken, welche beim Aufruf der Forenseite als Teil der Seite samt zugehörigem Material mitgeladen werden. Sollten Sie dies nicht wünschen, verwenden Sie beim Benutzen des Forums einen Blocker wie z.B. uMatrix, welcher das Laden von Inhaltsblöcken von Fremd-URLs effektiv unterbinden kann.
Wir blenden keine Werbung ein und schränken die Inhalte in keinster Weise bei Benutzung von Addblockern ein. Dadurch ist die Grundfunktionalität des Forums auch bei vollständigem Blockieren von Drittanbieter-Inhalten stets gegeben.

Cookies werden unsererseits nur verwendet um das Einloggen des Benutzers für die Dauer der Forenbenutzung zu speichern. Es steht dem Benutzer frei die Option 'Angemeldet bleiben' zu verwenden, damit der Cookie dauerhaft gespeichert bleibt und beim nächsten Besuch kein erneutes Einloggen mehr notwendig ist.
EMail-Adressen werden für Kontakt bei wichtigen Mitteilungen und zur Widerherstellung des Passwortes verwendet. Die verwendeten IPs können von uns ohne externe Hilfsmittel mit keiner realen Person in Verbindung gebracht werden und werden nach spätestens 7 Tagen gelöscht. Diese IPs werden höchstens verwendet um Neuanmeldungen unerwünschter oder gesperrter Nutzer zu identfizieren und zu unterbinden. Wir behalten uns daher vor bei Verdacht, die Frist für die IP-Löschung auf maximal 14 Tage zu verlängern.
Unsere Webseite läuft auf einem virtuellen Linux-Server, welcher von einem externen Anbieter gehostet wird. Etwaige Verstöße der DSGVO-Auflagen seitens dieses deutschen Hosters können wir nicht feststellen und somit auch nicht verfolgen.
Wir halten Backups unserer Datenbanken, welche in regelmäßigen Abständen als Schutz vor Katastrophen, Hackerangriffen und sonstigen Ausfällen erstellt werden. Sollte ein Nutzer die Löschung seiner Daten wünschen, betrachten wir es als Unzumutbar die Backups auch von den Daten zu befreien, da es sich hierbei um eine mehrtägiges Unterfangen handelt - dies ist für eine Einzelperson beim Betrieb eines privaten Forums nicht zumutbar möglich ohne das Backup komplett zu löschen.
Sollten Sie etwas gegen die dauerhafte anonyme Speicherung ihrer EMail-Adresse, ihres Pseudonyms und ihrer Beiträge in einem Backup haben, sehen Sie von der Registrierung in diesem Forum ab. Für Mitglieder, welche vor dem 25.05.2018 registriert waren steht jedoch das Recht im Raum, eine Löschung der Datenbank-Backups zu beantragen.



Wenn dies Ihr erster Besuch hier ist, lesen Sie bitte zunächst die FAQs sowie die wesentlichen Regeln zur Benutzung des Forums.
Um an den Diskussionen teilnehmen zu können, müssen Sie sich zunächst registrieren.

Näherung für sign()

Mathematische Fragestellungen
Antworten
positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Näherung für sign()

Beitrag von positronium » 15. Dez 2014, 14:50

Hallo allerseits,

ich möchte eine Funktion integrieren, in der sign() vorkommt. Leider rechnet Mathematica stundenlang, ohne ein Ergebnis zu liefern.

Der betreffende Teil der Formel sieht so aus: sign(v.u), enthält also ein Skalarprodukt zweier Vektoren. Die beiden Vektoren sind normiert; relevant sind also nur Parameter zwischen -1...1, die auf -1, 0(weniger wichtig) oder 1 abgebildet werden sollen.
Eine grobe Näherung ist natürlich, die Funktion sign() einfach weg zu lassen; dann klappt das integrieren recht flott. Das Ergebnis ist dann aber, dieses zur Überprüfung wiederum integriert, um den Faktor 2 zu gross (vorausgesetzt ich habe sonst keine Fehler mehr drin).

Kann mir jemand eine integrationsfreundliche Näherung für sign() nennen?
tanh() und x/sqrt(x²) bzw. x/sqrt(x²+epsilon²) habe ich versucht, erhalte aber ebenfalls nach langem Rechnen noch kein Ergebnis.
In der Mathematica-Hilfe wird tanh(2 n arctanh(1/x)) empfohlen; mit steigendem n wird die Näherung besser, der Ausdruck aber bald recht umfangreich.

Vielen Dank für Euere Hilfe!

Gruss

positronium

breaker
Ehrenmitglied
Ehrenmitglied
Beiträge: 1539
Registriert: 14. Jan 2006, 18:23

Re: Näherung für sign()

Beitrag von breaker » 15. Dez 2014, 15:03

Hi,

eine Näherung hab ich nicht für dich, aberwie wär denn folgendes:
Schreib das Skalarprodukt als und mach im Integral eine Substitution, sodass du am Ende über integrierst. Und dann rechnest du eben den Teil des Interals, wo ist, mit positivem Vorzeichen und den, wo ist, mit negativem. Zum Beispiel:

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 15. Dez 2014, 17:22

Vielen Dank für den Rat!
Das ist eine gute Idee, nur leider klappt das bei meinem Problem nicht. Die beiden Vektoren sollen nämlich nach Integration noch drehbar sein. Deshalb weiss ich beim Integrieren noch nicht, welcher Winkelbereich positiv bzw. negativ ist.

breaker
Ehrenmitglied
Ehrenmitglied
Beiträge: 1539
Registriert: 14. Jan 2006, 18:23

Re: Näherung für sign()

Beitrag von breaker » 15. Dez 2014, 17:54

Bin nicht sicher, ob ich das Problem gut genug verstehe. Kannst Du es genauer erklären?

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 15. Dez 2014, 18:42

Ja, natürlich.

Vereinfacht, habe ich zwei bekannte Vektoren v(normiert) und p, eine Matrix , welche diese beiden Vektoren rotiert, und einen Vektor u(normiert) in Beobachterrichtung .

Die Matrix m setzt sich aus zwei Matrizen zusammen. Erst eine Drehung um die X-Achse entspr. delta (X), und anschliessend eine Drehung um die Achse r={-1/2,sqrt[3]/2,0} entspr. alpha, wobei aber gilt, dass auch r um X gedreht wird (R), also:


Das Integral sieht so aus (C ist konstant):


Als Ergebnis sollte eine Funktion heraus kommen.

Wenn ich das ohne die Funktion sign, aber mit dem enthaltenen Skalarprodukt in Kugelkoordinaten (theta, phi) und mit der zeitlichen Veränderung alpha plotte, sieht das für theta=(0 bzw pi) in Z-Richtung so aus:
anim.gif
anim.gif (144.58 KiB) 10264 mal betrachtet
Ungefähr so, etwas dünner, etwas verzerrt, sollte es also auch mit sign[] aussehen.

edit: in der ersten Zeile stand d(normiert), muss aber v(normiert) heissen.

breaker
Ehrenmitglied
Ehrenmitglied
Beiträge: 1539
Registriert: 14. Jan 2006, 18:23

Re: Näherung für sign()

Beitrag von breaker » 15. Dez 2014, 23:49

Und u und v zeigen beide in beliebige Richtungen? Kann man nicht (sozusagen als Eichung) einen der beiden in x-Richtung legen, oder so?

Benutzeravatar
tomS
Ehrenmitglied
Ehrenmitglied
Beiträge: 10670
Registriert: 19. Nov 2007, 20:29

Re: Näherung für sign()

Beitrag von tomS » 16. Dez 2014, 07:19

Partielle Integration, Ableitung auf sign() wirken lassen ergibt die Delta-Funktion; gilt für jede epsilon-Darstellung von sign() und delta() sowie im Sinne der Distributionen auch exakt, wenn die andere zu integrierende Funktion entsprechend "glatt" ist
Gruß
Tom

Der Wert eines Dialogs hängt vor allem von der Vielfalt der konkurrierenden Meinungen ab.
Sir Karl R. Popper

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 16. Dez 2014, 11:41

breaker hat geschrieben:Und u und v zeigen beide in beliebige Richtungen?
u ist ja durch theta und phi Parameter; v ist auch jetzt schon für die Integration konstant.
breaker hat geschrieben:Kann man nicht (sozusagen als Eichung) einen der beiden in x-Richtung legen, oder so?
Das ist einen Versuch wert, wobei sich dadurch aber natürlich die Matrizen ändern. Vielleicht läuft das auf's gleiche hinaus, aber ich versuche es. Danke!

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 16. Dez 2014, 11:51

Yukterez hat geschrieben:Mit Sign[] hatte ich bis jetzt weder beim Differenzieren noch beim Integrieren ein Problem, so lässt sich zB
Plot[NIntegrate[Sign[Sin[x]], {x, 0, X}], {X, 0, 2 Pi}]
ganz einfach plotten. Bist du sicher dass es nicht ein Fehler im Code ist?
Ich glaube, dass der Code in Ordnung ist. Ich muss aber auch dazu schreiben, dass ich nicht numerisch mit NIntegrate[] integriere, sondern mit Integrate[], damit ich für die nächsten Rechenschritte keine Näherungen habe.
Yukterez hat geschrieben:Verlinke doch das .nb oder poste den ganzen Code, dann kann ich mal schaun ob ich den Hund bzw die passende Methode finde.
Vielen Dank für das Angebot!
Ich habe die Dateien hochgeladen. Du brauchst:
www
Yukterez hat geschrieben:PS: ist deine Funktion imaginär? Dann muss man natürlich schaun ob man davon den Re[], Im[] oder Abs[]-Teil braucht.
Nein, es ist alles Real.

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 16. Dez 2014, 11:54

tomS hat geschrieben:Partielle Integration, Ableitung auf sign() wirken lassen ergibt die Delta-Funktion; gilt für jede epsilon-Darstellung von sign() und delta() sowie im Sinne der Distributionen auch exakt, wenn die andere zu integrierende Funktion entsprechend "glatt" ist
Danke für den Hinweis!
Aber wie muss dann die Integration und das Ergebnis umgeschrieben werden?

Benutzeravatar
tomS
Ehrenmitglied
Ehrenmitglied
Beiträge: 10670
Registriert: 19. Nov 2007, 20:29

Re: Näherung für sign()

Beitrag von tomS » 16. Dez 2014, 12:15

Na ja, das wäre einfach



wenn 0 im Intervall [a,b] liegt.

Annfalls liegt kein Vorzeichenwechsel in der signum-Funktion vor und das Integral führ sofort auf F(x).
Gruß
Tom

Der Wert eines Dialogs hängt vor allem von der Vielfalt der konkurrierenden Meinungen ab.
Sir Karl R. Popper

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 16. Dez 2014, 13:47

Wie heisst die Umformung von Schritt 2 auf 3, also von der 2. auf die 3. Formel?

Benutzeravatar
tomS
Ehrenmitglied
Ehrenmitglied
Beiträge: 10670
Registriert: 19. Nov 2007, 20:29

Re: Näherung für sign()

Beitrag von tomS » 16. Dez 2014, 13:51

Partielle Integration
Gruß
Tom

Der Wert eines Dialogs hängt vor allem von der Vielfalt der konkurrierenden Meinungen ab.
Sir Karl R. Popper

breaker
Ehrenmitglied
Ehrenmitglied
Beiträge: 1539
Registriert: 14. Jan 2006, 18:23

Re: Näherung für sign()

Beitrag von breaker » 16. Dez 2014, 14:34

Ja, das ist eine sehr gute Idee von Tom. Man muss nur die Stammfunktion der Funktion f kennen (was in Deinem Fall möglich sein sollte)

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 16. Dez 2014, 21:06

Jetzt habe ich leider noch immer ein Problem: In der delta-Funktion steht für einen bestimmten Parametersatz (Variabel sind nur noch alpha, theta und phi.)

Im anderen Teil ist der Parameter delta noch enthalten.
Muss ich den obigen Ausdruck nach delta auflösen und dort einsetzen?
Der Parameter delta hätte zwei Formen in Abhängigkeit von theta und phi, und sähe so aus:


D.h. Lösungen dieser Funktionen mit ganzzahligem c1 ergeben erlaubte Werte für den Parameter delta. Naja, eigentlich müsste c1=0 sein, weil 0<=delta<=2pi gilt.

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 16. Dez 2014, 21:46

Es dürfte jetzt so passen, aber ich muss es noch in Reinschrift bringen, und variabler gestalten.
Vielen Dank, Tom, Frank und Yukterez!

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 19. Dez 2014, 11:55

Jetzt war ich zu früh optimistisch. :cry:
In der Sign-Funktion steht ja nicht die Integrationsvariable delta, sondern ein Skalarprodukt S, also Sign[S[delta,...]]. Damit die Delta-Funktion 0 wird, muss also S[delta]=0 gelten.
Für meinen einfacheren Parametersatz kommt das Ergebnis heraus, das im vorletzten Post steht. Das kann man umformen, und man erhält für delta keines, ein oder zwei Ergebnisse. Soweit könnte ich das noch berechnen, indem ich die Delta-Funktion weg lasse, und über diese 0 bis 2 Ergebnisse aufsummiere.
Beim komplizierteren Parametersatz sieht es aber schlecht aus. Dort gilt:

Wenn ich das nach delta auflöse, erhalte ich je nach Parametern eine Division durch Null. Der Grund dafür ist, dass die Integrationsvariable hier nicht einen oder mehrere konkrete Werte annimmt, sondern einen oder mehrere Wertebereiche. D.h. auch, dass das Integral nicht wegfallen darf, und deshalb wird das Problem nur verschoben.
Könnte es sein, dass ein solches Integral nur numerisch lösbar ist?

Benutzeravatar
tomS
Ehrenmitglied
Ehrenmitglied
Beiträge: 10670
Registriert: 19. Nov 2007, 20:29

Re: Näherung für sign()

Beitrag von tomS » 19. Dez 2014, 12:53

wie sieht den der gesamte Ausdruck nach partieller Integration aus?
Gruß
Tom

Der Wert eines Dialogs hängt vor allem von der Vielfalt der konkurrierenden Meinungen ab.
Sir Karl R. Popper

Skeltek
Site Admin
Site Admin
Beiträge: 5085
Registriert: 25. Mär 2008, 23:51
Wohnort: Stuttgart, Germany
Kontaktdaten:

Re: Näherung für sign()

Beitrag von Skeltek » 19. Dez 2014, 13:02

positronium hat geschrieben: Die beiden Vektoren sind normiert; relevant sind also nur Parameter zwischen -1...1, die auf -1, 0(weniger wichtig) oder 1 abgebildet werden sollen.
Habe mit Mathematica noch nie gearbeitet, aber ein paar der moderneren Implikationen von sign() in vielen Programmiersprachen geben nicht nur -1, 0 oder 1 zurück, sondern eine Zahl, deren Betrag ungleich 1 sein kann(ähnlich wie compare(), das auch nicht nur -1, 0 oder +1 bei kleiner, gleich oder größer zurück gibt). Ich würde mir da auf jeden Fall die Dokumentation deiner derzeitigen Softwareversion holen oder die Sign Funktion erstmal auf Funktionsweise testen. gut wäre es das Ergebniss von Sign zur Sicherheit zu normieren.
Übrigens wäre ich auch vorsichtig was das Anwenden auf Floats angeht, da diese niemals Null werden können.

Zu deinen normierten Vektoren:
Das Normieren eines Vektors "nahe Null" kann die wildesten Ergebnisse liefern. Wenn dich nur das Vorzeichen interessiert, lasse das vorherige normieren in jedem Fall weg. Skalarprodukt zwischen zwei normierten Vektoren wird dir ohnehin in der Regel des nicht-entarteten Falles eine Zahl ungleich 1 oder Null liefern.

Ich habe vor kurzem im Rahmen eines größeren Projektes eine Klasse mit Hilfsfunktionen zur Vektorrechnung erstellt. Übliche Fehlerquellen bei den meisten Leuten würde ich bei der Art von Programmiervorhaben auf fehlerhaft begriffene Syntax der vorimplementierten Funktionen, das normieren eines Vektors nahe Null oder einen Variablenüberlauf schieben.
z.B. habe ich statt sinf() an einer Stelle sin() verwendet, was als Fehler fast unauffindbar war.

Beim Determinieren des Arctan hatte ich das Problem, dass das Ergebniss bei Division nahe Null inakkurat wird. Hier half mir nur eine Fallunterscheidung für Winkel zwischen [-Pi/4,Pi/4], [Pi/4,3Pi/4], [3Pi/4,5Pi/4] und [5Pi/4,7Pi/4].
Zur Not würde ich das Problem rekursiv lösen, indem ich die einzelnen Summanden separat berechnen lasse und jeder Summand umgeht seine eigenen Problemstellen für sich.
Bei numerischen Berechnungen immer Polstellen bzw Division durch Null vermeiden.

Sorry, mit Mathematica kenne ich mich Null aus. Alles was ich tun kann ist die üblichen Fehlerquellen zu nennen.
Gödel für Dummies:
  • Unentscheidbarkeit - Dieser Satz ist wahr.
  • Unvollständig - Aussage A: Es existiert nur ein Element A.
  • Widersprüchlich - Dieser Satz ist falsch.

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 19. Dez 2014, 14:29

tomS hat geschrieben:wie sieht den der gesamte Ausdruck nach partieller Integration aus?
Ich nehme hier den komplizierteren Parametersatz, und führe ein paar Variablen ein:
Das Integral sieht am Anfang vom Prinzip her so aus

und ersetze den Ausdruck in Sign[] durch a, und den hinteren durch b:




Die Stammfunktion von b ist



Nach der partiellen Integration hat man dann mit






Jetzt müsste ich natürlich a=0 setzen, und das nach delta auflösen. Das ergibt mehrere Ergebnisse, die z.B. so aussehen:

positronium
Ehrenmitglied
Ehrenmitglied
Beiträge: 2832
Registriert: 2. Feb 2011, 20:13

Re: Näherung für sign()

Beitrag von positronium » 19. Dez 2014, 14:34

Vielen Dank für Deine Ausführungen, Skeltek!
Das trifft aber alles nicht zu, weil ich in Mathematica symbolisch rechne. An der Rechengenauigkeit kann es also nicht liegen. Es ist ein Problem beim Integrieren.

Antworten