Die Mathe-Redaktion - 30.03.2020 15:10 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte / Top 15
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt? im neuen Schwätz
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps für den MP

Werbung

Bücher zu Naturwissenschaft und Technik bei amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 482 Gäste und 28 Mitglieder online

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von Spock mire2
Mathematische Software & Apps » Mathematica » Mengen-Variablen
Druckversion
Druckversion
Autor
Kein bestimmter Bereich J Mengen-Variablen
2stein
Junior Letzter Besuch: im letzten Monat
Dabei seit: 01.12.2015
Mitteilungen: 18
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2020-02-26


Hi,

ich würde mit Mathematica gerne mit Mengentermen rechnen,
aber nicht mit zugewiesenen Werten, sonder allgemein.

Beispiel:
Vereinfachen des Terms:

\( (A \setminus B) \cup (B \setminus A) \cup (A \cap B) \)

das sollte dann rauskommen:

\(A \cup B\)

Ohne weiter Angaben zu A und B kommt eine Fehlermeldung:
Nonatomic expression expected at position ...

Wie ich das verstanden habe, werden Mengen als Listen gehandlet.
Ich müßte also die Listen A und B definiern, ohne sie mit Werten zu belegen.
Möglich?

Gruß: 2stein




  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 1142
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2020-02-27


Hallo 2stein,

es ist richtig, dass Mengen in Mathematica als Listen dargestellt werden. Man kann allerdings nur entweder Berechnungen mit konkreten Mengen vornehmen oder aber man lässt Mengenausdrücke lediglich symbolisch umformen. Was Du machen möchtest, ist letzteres. Eine Liste zu definieren, ohne dabei eine konkrete Menge anzugeben, geht so nicht bzw. macht hier keinen Sinn.

Mir ist nicht bekannt, dass Mathematica bereits ein Package zur Verfügung stellt, mit dem man Mengenausdrücke symbolisch umformen kann. Aber vielleicht kann jemand anderes dazu mehr sagen.

Was man aber auf jeden Fall machen kann, ist, symbolische Rechenregeln für Mengen selbst zu definieren gemäß der bekannten Rechenregeln, die für Mengen gelten. Dann ist es möglich, symbolische Umformungen unter Anwendung dieser Rechenregeln von Mathematica vornehmen zu lassen. Aber da kann ich Dir gleich schon sagen, dass das eine sehr aufwendige Geschichte ist, da die Umformungen ja nur dann sehr gut gelingen, wenn wirklich alle bekannten Rechenregeln in Mathematica eingespeist wurden.

Die prinzipielle Vorgehensweise wäre, dass man für jede Rechenregel (Umformungsmöglichkeit) eine Funktionsdefinition vornimmt und diese kann man dann optional mit den entsprechenden mathematischen Symbolen (Rechenzeichen) verknüpfen (letzteres ist aber nicht zwingend notwendig).

Ich will das mal anhand eines Beispiels demonstrieren.
Nehmen wir doch mal direkt Deinen Beispielterm und bringen wir Mathematica bei, dass hierbei A vereinigt mit B herauskommt. Für die Funktionsnamen würde ich empfehlen, eigene Funktionsnamen zu wählen, die nicht mit den Mathematica-Funktionsnamen kollidieren.

A ohne B entspricht MyWithout[A, B]
A vereinigt mit B entspricht MyUnion[A, B]
A geschnitten mit B entspricht MyIntersection[A, B]

Um Deinen Beispielterm zu definieren kann man dann folgende Funktionsdefinition eingeben:
Mathematica
MyUnion[MyWithout[A_, B_], MyWithout[B_, A_], MyIntersection[A_, B_]] := MyUnion[A, B]

Ab sofort kennt Mathematica dann diese Mengen-Rechenregel.
Wenn Du jetzt eingibst:
Mathematica
MyUnion[MyWithout[C, D], MyWithout[D, C], MyIntersection[C, D]]
dann kommt als Ergebnis richtigerweise
Mathematica
MyUnion[C, D]
heraus.

Falls man jetzt aber lieber mathematische Symbole anstatt Funktionsnamen verwenden möchte, müsste man die einzelnen Funktionsnamen noch mit den gewünschten mathematischen Symbolen assoziieren. Dies kann aber zu Kollisionen mit Mathematica-internen Definitionen führen, die bereits für die diversen Symbole hinterlegt sind. Daher empfiehlt es sich, möglichst Symbole zu verwenden, die noch mit keinen störenden Funktionsdefintionen belegt sind. Ich verwende mal folgende Symbole:

$\otimes$ d. h. CircleTimes für MyWithout
$\smile$ d. h. Cup für MyUnion
$\frown$ d. h. Cap für MyIntersection

Damit definiert man:
Mathematica
Unprotect[System`CircleTimes];
Unprotect[System`Cup];
Unprotect[System`Cap];
System`CircleTimes[A_, B_] := MyWithout[A, B];
System`Cup[CircleTimes[A_, B_], CircleTimes[B_, A_], Cap[A_, B_]] := 
  MyUnion[A, B];
System`Cap[A_, B_] := MyIntersection[A, B];
MyUnion[A_, B_] := System`Cup[A, B]
Protect[System`CircleTimes];
Protect[System`Cup];
Protect[System`Cap];

Dann kann man die gewünschte Eingabe vornehmen:
Mathematica
(A \[CircleTimes] B) \[Cup] (B \[CircleTimes] A) \[Cup] (A \[Cap] B)
und man erhält das gewünschte Resultat
$A\smile B$

Aber denke wie gesagt daran, dass Mathematica nur solche Umformungen vornehmen kann, dessen Rechenregeln es auch kennt. Diese muss man dem System eben alle beibringen.
Erkundige Dich jedoch vorsichtshalber nochmal, ob Mathematica nicht schon standardmäßige symbolische Umformungsmöglichkeiten für Mengenausdrücke zur Verfügung stellt. Mir ist da jedoch nichts dergleichen bekannt.

Aber auf jeden Fall hast Du jetzt mal das Grundrezept, wie Du Dir eigene symbolische Termumformungen basteln kannst. Das kann man natürlich beliebig komplex betreiben. Ist halt nur viel Arbeit, all die bekannten Rechenregeln einzugeben. Solltest Du nur für ein, zwei Terme eine Umformung benötigen, lohnt sich der Aufwand hierfür jedoch nicht.

Ich hoffe, ich konnte Dir weiterhelfen.

LG Primentus

Edit:
Ach ja - wichtig ist noch, dass der Anweisungsblock mit Unprotect... bis ...Protect zweimal hintereinander ausgeführt werden muss, da ansonsten anscheinend nicht alle Definitionen sofort übernommen werden.



  Profil  Quote  Link auf diesen Beitrag Link
2stein
Junior Letzter Besuch: im letzten Monat
Dabei seit: 01.12.2015
Mitteilungen: 18
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2020-02-28


Hallo Primentus,

erstmal vielen Dank für deine umfangreiche Antwort.

Ich habe deinen Ansatz mal ausgestestet, und es funktioniert wunderbar -
auch mit den eigens creierten Symbolen.

Wie du schon geschrieben hast, müsste man jetzt bei jeder Formel,
die man implementieren will, gleichermassen vorgehen, was in der Tat aufwendig wird.

Mich interessierte eben ganz allgemein, ob Mathematica das von Haus aus kann - also offensichtlich nicht.
Ein entsprechendes Package (V11) ist wohl nicht dabei.



Ein anderer Ansatz könnte darin bestehen, Mengenterme auf aussagenlogische Terme zurückzuführen, mit denen Mathematica ja gut rechnen kann.

Beispiel Union  - Eine mögliche Definition ist:
(G sei Grundmenge)

\(A \cup B := \{x \in G \mid x \in A \lor x \in B \}\)

oder einfach als reiner als Logikterm:

\(p \lor q\)

weitere Entsprechungen aufgrund der jeweiligen Definitionen sind:

\( A \cap B\)  :  \(p \land q\)
\( \bar{A} \) (Komplementmenge)   :    \(\lnot p\)  
\( A \setminus B \)   :  \(p \land \lnot q \)
\( A \subseteq B \) (Teilmenge)   : \(p \Rightarrow q \)   (Implikation)

Nun müßte man irgendwie einen Mengenterm in die logische Entsprechung durch Mathematica übersetzten lassen, dann vereinfachen, und dann wieder rückübersetzten.

Die von dir gezeigten Techniken wären da sicherlich schon mal ein Ansatz.

Oder man übesetzt der Einfachheit halber selber.
Bei meinem Beispiel wäre das:

\( (A \setminus B) \cup (B \setminus A) \cup (A \cap B) \)

wird zu:

\( (p \land \lnot q) \lor (q \land \lnot p) \lor (p \land q) \)


Mathemetica:

\(\text{In[1]:= Simplify}[(p\land \neg q)\lor (q\land \neg p)\lor (p\land q)]\)
\(\text{Out[1]= p || q}  \)

was \(A \lor B\) entspricht

Gruß:
2stein

edit: Flüchtigkeitsfehler verbessert



  Profil  Quote  Link auf diesen Beitrag Link
Primentus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 18.02.2016
Mitteilungen: 1142
Aus: Deutschland
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, eingetragen 2020-02-28


Hallo 2stein,

gern geschehen.

Mir ist zumindest nichts bekannt, dass es schon ein vorgefertiges Package zum Umformen symbolischer Mengenausdrücke gibt, worüber ich mich ehrlich gesagt auch schon mal gewundert habe. Mit allgemeinen symbolischen Ausdrücken kann Mathematica natürlich schon ganz gut umgehen bzw. diese ggf. umformen. Dein Beispiel der logischen Ausdrücke ist da ein sehr gutes. Bei den Mengenausdrücken hat man auch ein Problem mit dem \ Zeichen (also bei "A ohne B"). Das lässt sich so auch nicht als mathematisches Rechensymbol in Mathematica verwenden. Hierfür müsste man in jedem Fall ein alternatives Rechensymbol finden.

Das einfachste Vorgehen ist dann wohl wirklich Dein letzter beschriebener Weg, dass man den Mengenausdruck selbst in einen aussagenlogischen Ausdruck übersetzt, von Mathematica vereinfachen lässt und sich dann das Resultat selbst in die Mengenschreibweise übersetzt. Ist natürlich ein bisschen schade, weil da nicht alles automatisiert ist.

Zu Deinem anderen Vorschlag mit dem Übersetzen und Rückübersetzen des Ausdrucks:

Das habe ich versucht, anhand eines Beispiels zu programmieren, aber festgestellt, dass Mathematica Probleme dabei hat, wenn in beide Richtungen Funktionsdefinitionen existieren. Das heißt, wenn man Mengenausdrücke in aussagenlogische Ausdrücke umwandeln lässt und umgekehrt, dann landet Mathematica in einer Art Endlosschleife, weil er dann ständig übersetzt, rückübersetzt, dann wieder übersetzt, usw. Da habe ich noch keinen praktikablen Weg gefunden, wie man das unterbinden kann.

Was mir aber gelungen ist, das ist Funktionsdefinitionen so zu gestalten, dass man den Mengenausdruck in seiner Ursprungsform (d. h. in der Variante mit Rechensymbolen, zu denen noch keine störenden Funktionsdefinitionen existieren) eingibt und durch Simplify vereinfachen lässt, und als Ergebnis erscheint dann A || B (also eine Art Mischmasch aus Mengen- und aussagenlogischer Schreibweise), was man sich dann selbst noch als $A\cup B$ übersetzen muss. Das habe ich wie folgt gemacht, wobei ich anstelle der sperrigen Funktionsnamen Intersection, Union und MyWithout die Funktionsnamen n, u und o verwendet habe:
Mathematica
n[A_, B_] := A \[And] B
u[A_, B_] := A \[Or] B
u[A_, B_, C_] := A \[Or] B \[Or] C
o[A_, B_] := A \[And] \[Not] B
Unprotect[System`CircleTimes];
Unprotect[System`Cup];
Unprotect[System`Cap];
System`CircleTimes[A_, B_] := o[A, B];
System`Cup[A_, B_] := u[A, B];
System`Cup[A_, B_, C_] := u[A, B, C];
System`Cap[A_, B_] := n[A, B];
Protect[System`CircleTimes];
Protect[System`Cup];
Protect[System`Cap];

Aufruf:
Simplify[$(A\otimes B)\smile(B\otimes A)\smile(A\frown B)$]

Ergebnis ist wie gesagt
A || B

Ist aber halt auch wieder mit einigem Aufwand verbunden, so dass wahrscheinlich Dein Weg, den Du zuletzt beschrieben hast, am sinnvollsten ist.

LG Primentus



  Profil  Quote  Link auf diesen Beitrag Link
2stein
Junior Letzter Besuch: im letzten Monat
Dabei seit: 01.12.2015
Mitteilungen: 18
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.4, vom Themenstarter, eingetragen 2020-03-01


Hallo Primentus,

mit deinem Ansatz der Übersetzung in die Logik lässt sich ja so schon viel machen.

Ich hab das mal erweitert um die Teilmenge und die Mengengleichheit
(hab einfach das nachgemacht, was du vorgemacht, hast...)
Mathematica
n[A_, B_] := A \[And] B              (*Schnittmenge*)
n[A_, B_, C_] := A \[And] B \[And] C 
u[A_, B_] := A \[Or] B               (*Vereinigung*)
u[A_, B_, C_] := A \[Or] B \[Or] C
o[A_, B_] := A \[And] \[Not] B       (*Differenzmenge "A ohne B"*)
t[A_, B_] := A \[Implies] B          (*Teilmenge*)
g[A_, B_] := A  \[Equivalent] B      (*Gleichheit*)
 
 
Unprotect[System`Cap];
Unprotect[System`Cup];
Unprotect[System`CircleTimes];
Unprotect[System`CupCap]; 
Unprotect[System`LeftRightArrow];
 
   (*   Schnittmenge   \[Cap]            *)
System`Cap[A_, B_] :=  n[A, B];           
System`Cap[A_, B_, C_] := n[A, B, C];
   (*   Vereinigung    \[Cup]            *)
System`Cup[A_, B_] :=  u[A, B];           
System`Cup[A_, B_, C_] := u[A, B, C];
   (*   Differenzmenge \[CircleTimes]    *)
System`CircleTimes[A_, B_] :=  o[A, B];
   (*   Teilmenge      \[CupCap]         *)   
System`CupCap [A_, B_] :=  t[A, B];         
   (*   Gleichheit     \[LeftRightArrow] *)
System`LeftRightArrow[A_, B_] :=  g[A, B];
 
 
Protect[System`Cap];
Protect[System`Cup];
Protect[System`CircleTimes];
Protect[System`CupCap];
Protect[System`LeftRightArrow];

Man kann auch Mengenterme auf Gleicheit prüfen,
bzw Mengentermbeziehungen zeigen.
Dann entfällt die Ausgabe des Logikterms:
Mathematica
(* Zeige A \[Intersection] (B \[Union] C) = (A \[Intersection] B)  \[Union] (A \[Intersection] C)           (Distributivgesetz)  *)
Equivalent [  A \[Cap] (B \[Cup] C), (A \[Cap] B) \[Cup] (A \[Cap] C)] // TautologyQ
 
 
(* Zeige, dass nachfolgende Beziehungen gleich sind:*)
(*A \[SubsetEqual] B,    A \[Union] B = B, A \[Intersection] B = A*) 
Equivalent[a \[CupCap] b, a \[Cup] b \[LeftRightArrow] b, a \[Cap] b \[LeftRightArrow] a] // TautologyQ

Zur Vollständigkeit würde noch die leere Menge \(\varnothing\) (False bei Logik),
Komplementmente \(\bar{A}\) (Not A),
die Grundmenge \(\bar{\varnothing}\) (True) fehlen.
Das konnte ich aus deinen Vorgaben nicht erstellen.

Anyway - es bleibt sicherlich etwas umständlich und,
wie du geschrieben hast, ist das eigene Umformen wohl das einfachste.

Danke noch mal und Gruß:
 
2stein






  Profil  Quote  Link auf diesen Beitrag Link
2stein hat die Antworten auf ihre/seine Frage gesehen.
2stein hat selbst das Ok-Häkchen gesetzt.
2stein wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2020 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]