2016-07-08 13 views
1

Das Lösen eines Dreiecks bedeutet, alle möglichen Dreiecke zu finden, wenn einige seiner Seiten a, b und c und die Winkel A, B, C (A ist der Winkel gegenüber a usw.) sind bekannt. Dieses Problem hat 0, 1, 2 oder unendlich viele Lösungen.Lösen eines Dreiecksverfahrens

Ich möchte eine Prozedur schreiben, um Dreiecke zu lösen. Der Benutzer würde die Prozedur mit einigen Daten zwischen a, b, c, A, B und C versorgen (wenn es der Einfachheit halber notwendig ist, können Sie davon ausgehen, dass der Benutzer Situationen vermeiden wird, in denen es unendlich viele Lösungen gibt) und Die Prozedur berechnet die anderen. Das Übliche erfordert je nach Situation das Gesetz der Sünde oder das Gesetz des Kosmos.

Da es für eine Math-Klasse ist, wo ich auch Graphen von Funktionen zeigen möchte, werde ich es in Maple implementieren. Wenn Maple nicht für Ihre Antwort geeignet ist, schlagen Sie bitte eine andere Sprache vor (ich bin zum Beispiel relativ kompetent in Java und Anfänger in Python).

Meine naive Idee ist die Verwendung von bedingten Anweisungen wenn ... dann ... sonst, um den Fall in der Hand zu bestimmen, aber es ist ein bisschen langweilig. Java hat einen Schalter, der Dinge kürzer und klarer machen könnte, aber ich hoffe auf eine klügere Struktur.

Daher meine Frage: Angenommen, dass einige Variablen durch bekannte Beziehungen verwandt sind. Gibt es eine einfache und klare Möglichkeit, eine Prozedur zu organisieren, um fehlende Variablen zu bestimmen, wenn nur einige Werte angegeben werden?

PS: nicht sicher, wie ich diese Frage markieren sollte. Jeder Vorschlag ist willkommen.

Antwort

1

Ein Ansatz könnte sein, alle Argumente für Ihre Prozedur optional mit Standardwerten zu versehen, die den Namen A, B, C, a, b, c entsprechen. Da wir annehmen können, dass alle fehlenden Variablen nicht vom Typ 'numerisch' sind, können wir schnell feststellen, welche Variablen noch keine Werte haben und diese als Werte für einen auflösenden Befehl angeben die restlichen Seiten oder Winkel.

etwas wie das folgende könnte ein guter Anfang sein:

trisolve := proc({ side1::{positive,symbol} := A, side2::{positive,symbol} := B, side3::{positive,symbol} := C, 
        angle1::{positive,symbol} := a, angle2::{positive,symbol} := b, angle3::{positive,symbol} := c }) 
    local missing := remove(hastype, [ side1, side2, side3, angle1, angle2, angle3 ], numeric); 

    return solve({ 180 = angle1 + angle2 + angle3, 
       side1/sin(angle1*Pi/180)=side2/sin(angle2*Pi/180), 
       side1/sin(angle1*Pi/180)=side3/sin(angle3*Pi/180), 
       side2/sin(angle2*Pi/180)=side3/sin(angle3*Pi/180), 
       side1^2=side2^2+side3^2-2*side2*side3*cos(angle1) }, 
       missing); 
end proc: 

Der folgende Aufruf:

trisolve(side1 = 1, angle1 = 90, angle2 = 45); 

kehrt:

[B = (1/2)*sqrt(2), C = (1/2)*sqrt(2), c = 45] 
+0

Dank. Ich habe eine ähnliche Lösung gefunden. Beachten Sie, dass das Gesetz der Sinus nicht ausreicht, und das Gesetz des Kosinus sollte in der Liste der Gleichungen hinzugefügt werden. Ich hatte ein Problem mit der Deklaration von Variablen, da ich die Prozedur mit Radiant verwenden werde und Ausdrücke wie Pi/2 den Typ '*' haben. Außerdem gibt die Prozedur 'seltsame' Ergebnisse wie arctan (sqrt (2)/2, sqrt (2)/2) zurück. Wenn Sie die Lösung erneut anzeigen, werden vereinfachte Ausdrücke wie Pi/4 angezeigt. – Taladris