Wie löse ich ein überbestimmtes System in Mathematica?

  • Ich möchte die Gründe verstehen und einen Weg finden, um ein solches Verhalten der Funktion Solve in Mathematica 8 zu vermeiden.

     Solve[x + y + z == 5 && y == 3 , {x, y}]
    (* Out[1]= {{x -> 2 - z, y -> 3}} *)
    
    Solve[x + y + z == 5 && y == 3 , {x}]
    (* Out[2]= {} (why empty?) *)
     

    Ich muss im zweiten Fall eine Antwort bekommen. Irgendwelche Vorschläge, wie man das Programm dazu bringen kann, eine Antwort zu berechnen, die noch einfacher als die erste ist?

    30 May 2012
    helloandreDrahcir
3 answers
  • Im Allgemeinen haben Sie, wenn das Gleichungssystem überbestimmt ist, ein Optimierungsproblem und würden daher nicht erwarten, dass Solve oder Reduce die richtigen Werkzeuge sind, da die Gleichungen wahrscheinlich nicht "genau" lösbar sind, sondern nur auf eine "bestmögliche" Art und Weise.

    Sie würden stattdessen das Optimierungsproblem in Form einer Verdienstfunktion formulieren, die Sie zu extremieren versuchen. In einem linearen Gleichungssystem möchten Sie beispielsweise die Summe der Fehlerquadrate für jede Gleichung minimieren.

    Eine einfache Implementierung wäre die Verwendung von Minimize, und für speziellere Lösungen können PseudoInverse oder SingularValueDecomposition verwendet werden. Da Ihr Beispiel sehr einfach ist, versuche ich nur zu erläutern, wie Sie es mit Minimize behandeln können:

     Last@Minimize[{(x + y + z - 5)^2, y == 3}, {x}]
     

    Hier wird y == 3 als -Einschränkung eingegeben, während die andere Gleichung in eine quadrierte "Merit-Funktion" umgewandelt wird, die minimiert werden muss. Diese letzte Funktion würde im Allgemeinen eine Summe von mehreren Quadraten sein, wenn Sie mehr Gleichungen haben.

    Das Ergebnis ist ein Ausdruck Piecewise, von dem wir nur den Teil benötigen, der tatsächlich y == 3 erfüllt:

    $ \ left \ {x \ bis \ begin {cases} 2-z & amp; y = 3 \\ \ text {Indeterminate} & amp; \ text {True} \ end {cases} \ right \} $

    Eine Alternative wäre:

     Last@Minimize[{(x + y + z - 5)^2 + (y - 3)^2}, {x}]
     

    $ \ {x \ bis 5 - y - z \} $

    < / blockquote>
    31 May 2012
    Michael PryorUnknown user
  • Die Erklärung finden Sie auf der Dokumentationsseite von Solve unter Options -> MaxExtraConditions sowie unter Possible Issues (in einer weniger offensichtlichen Form).

    Sie können Solve zwingen, Ihnen eine Lösung wie diese zu geben:

     In[1]:= Solve[x + y + z == 5 && y == 3, {x}, MaxExtraConditions -> All]
    Out[1]= {{x -> ConditionalExpression[2 - z, y == 3]}}
     

    Mit der Einstellung MaxExtraConditions -> All können Solve zusätzliche Bedingungen generieren und eine Lösung zurückgeben, die nur unter diesen speziellen Bedingungen gültig ist Bedingungen. Standardmäßig versucht Solve nicht, dieses (normalerweise rechenintensive) Manöver durchzuführen. In Ihrem speziellen Beispiel heißt es, dass es keine Lösungen gibt, da es tatsächlich keine Lösungen gibt, es sei denn, die ganz bestimmte Bedingung, dass y gleich 3 ist, ist wahr.

    I erkennen, dass diese Interpretation der Gleichungen zunächst nicht intuitiv ist.

    Die andere Lösung verwendet Reduce, die immer versucht, alle Bedingungen zu generieren, die für die Gültigkeit der Lösung erforderlich sind. sogar sehr spezielle (z. B. dass a nicht Null sein darf, damit a x == 1 eine Lösung hat).

    30 May 2012
    Szabolcs
  • Sie könnten in diesem Fall Reduce verwenden:

     Reduce[x + y + z == 5 && y == 3, {x}]
    
    (* output: y == 3 && x == 2 - z *)
     

    ToRules transformiert Dieser Ausdruck wird zu einer Liste von Regeln, z. B.

     ToRules[Reduce[x + y + z == 5 && y == 3, {x}]]
    
    (* output: {y -> 3, x -> 2 - z} *)
     
    30 May 2012
    EAMannAndrew