Entwickler-Ecke
Basistechnologien - arcsin Methode
interessierter - So 06.05.12 13:38
Titel: arcsin Methode
Hallo Zusammen
Ich arbeite an einem recht umfangreichen Übungsprogramm wo es unter anderem um die Berechnung von Dreiecken geht.
Habe ein Problem mit der arcsin (asin oder arcus sinus) Methode. Meine Konsole spuckt immer nur das Ergebnis n. def. Folgend wie ich versuchte die Methode asin anzuwenden.
C#-Quelltext
1: 2: 3: 4: 5: 6:
| float bekannteSeitea = askForFloat("Welche Goresse hat die bekannte Seite a?"); float bekannteSeiteb = askForFloat("Welche Groesse hat die bekannte Seite b?"); float WinkelAlpha = askForFloat("Welchen Wert hat der bekannte Winkel Alpha?"); float x = bekannteSeiteb * WinkelAlpha / bekannteSeitea; Math.Asin(x); Console.WriteLine(x); |
Kurz noch zum allg. Verständnis:
gegeben sind:
seite a, seite b, der der grösseren seite gegenüberliegende winkel
gesucht ist:
den der kleineren seite gegenüberliegende winkel
Von der formel her stimmt. Mein Problem liegt mehr darin wie ich asin formgerecht in meinem Code anwenden kann.
Grüsse
interessierter
jaenicke - So 06.05.12 13:44
Erstens wäre es sinnvoll, wenn du das Ergebnis, das dir Asin zurückliefert, nicht einfach wegwerfen würdest. ;-)
Denn sonst kannst du die Zeile auch gleich weglassen.
Und zweitens denke dran, dass die internen Funktionen wie asin nicht mit Gradzahlen, sondern im Bogenmaß arbeiten.
interessierter - So 06.05.12 14:19
Oke, somit muss ich die Grad anschliessend in Bogenmass umrechnen. Habe nun den Code umgeschrieben aber es klappt trotzdem nicht. Was mache ich den Falsch? Folgend mein neuer Lösungsversuch mit meinem Gedankenansätzen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| float bekannteSeitea = askForFloat("Welche Goresse hat die bekannte Seite a?"); float bekannteSeiteb = askForFloat("Welche Groesse hat die bekannte Seite b?"); float WinkelAlpha = askForFloat("Welchen Wert hat der bekannte Winkel Alpha?");
doublex = Math.Asin(bekannteSeiteb * WinkelAlpha / bekannteSeitea);
double WinkelBeta = (Math.PI / 180) * x);
Console.WriteLine(WinkelBeta); |
Th69 - So 06.05.12 14:27
Der WinkelAlpha muß im Bogenmaß an die trigonometrische Funktion weitergereicht werden.
P.S: Und das Mal-Zeichen (Multiplikation) solltest du eigentlich auch kennen...
interessierter - So 06.05.12 14:28
hehe, habs grad editiert und das malzeichen * genommen
jaenicke - So 06.05.12 14:33
Bist du da sicher? :zwinker:
Schauen wir doch mal:
Gegeben:
a, b, α
Gesucht:
β
Sinussatz:
a / sin(α) = b / sin(β)
--> a = b * sin(α) / sin(β)
--> a * sin(β) = b * sin(α)
--> sin(β) = b * sin(α) / a
--> β = asin(b *
sin(α) / a)
Nun vergleiche einmal was du dort einsetzt. Außerdem muss auch der Eingabewert wie
Th69 schon geschrieben hat im Bogenmaß sein.
interessierter - So 06.05.12 15:28
Oke, ich danke euch nun ist mir einiges klarer.
Ich habe jetzt ein neues Konsolenprogramm gemacht wo ich nur die Methode (rechne in Bogenmass um) gecodet habe.
Ab static void main will ich nun auf die Methode zugreigen und die gewünschte Ausgabe machen.
Wie kann ich mittels einer Eingabe auf die Methode zugreifen und die entsprechende Aussage machen?
Hier mein Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { public static double GradZuBogenmass(double Grad) { return (Math.PI / 180.0) * Grad; }
static void Main(string[] args) {
}
} } |
Wenn ich noch erfahre wie man auf die Funktion zugreift, kann ich mein Problem lösen.
jaenicke - So 06.05.12 15:45
Naja, so wie du jede andere Funktion auch aufrufst? :gruebel:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| static void Main(string[] args) { double MyAngle = 90; double MyRadValue = GradZuBogenmass(MyAngle); ... } |
interessierter - So 06.05.12 16:50
Ich habe hier einen weiteren Lösungsansatz, wo ich den bekannten Winkel zuerst in Bogenmass umrechne und mittels der gegebeben Formel für den fehlenden Winkel weiterverwende.
In meinem neuen Code müsste die WriteLine den Wert des fehlenden Winkels ausgeben, was nicht klappt. Hier der Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { public static double GradZuBogenmass(double Grad) { return (Math.PI / 180.0) * Grad; }
static void Main(string[] args) { Console.WriteLine("wieviel grad misst der bekannte Winkel?"); string text = Console.ReadLine(); double Eingabe = double.Parse(text); double Winkel = Eingabe; double Winkelmass = GradZuBogenmass(Winkel);
Console.WriteLine("bekannte seite a?"); string x = Console.ReadLine(); float bsa = float.Parse(x); Console.WriteLine("bekannte seite b?"); string y = Console.ReadLine(); float bsb = float.Parse(y); double WinkelBeta = Math.Asin(bsb * Winkelmass / bsa); Console.WriteLine(WinkelBeta); }
} } |
jaenicke - So 06.05.12 17:05
Den Fehler in der Formel hatte ich ja oben schon angemerkt. ;-)
Zudem fehlt die Rückwandlung von Bogenmaß in Grad beim Ergebnis.
interessierter - Mi 09.05.12 20:03
Ich bastle nun schon seit Tagen an dieser Sache rum, aber es will nicht klappen. Ich verstehe auch nicht wo der Fehler in der Formel liegt. Ich habe nun noch einen Lösungsansatz wo ich meiner Meinung nach alles berücksichitige. Wo liegt denn Mein Fehler?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine("wieviel grad misst der bekannte Winkel?"); string Winkel = Console.ReadLine(); double bekannterWinkel = double.Parse(Winkel); double WinkelAlpha = bekannterWinkel / 180 * Math.PI; Console.WriteLine(WinkelAlpha); Console.WriteLine("bekannte seite a?"); string x = Console.ReadLine(); float bsa = float.Parse(x); Console.WriteLine("bekannte seite b?"); string y = Console.ReadLine(); float bsb = float.Parse(y); double WinkelBeta = bsb * WinkelAlpha / bsa;
WinkelBeta= WinkelBeta * 180 / Math.PI; Console.WriteLine(WinkelBeta);
}
} } |
jaenicke - Mi 09.05.12 20:31
Wie schon gesagt, deine Formel ist falsch. Und eigentlich musst du das echt nur noch abschreiben, deshalb verstehe ich das Problem nicht so ganz...
jaenicke hat folgendes geschrieben : |
--> β = asin(b * sin(α) / a)
|
interessierter hat folgendes geschrieben : |
C#-Quelltext 1:
| double WinkelBeta = bsb * WinkelAlpha / bsa; | |
Fällt dir da wirklich kein Unterschied auf? So von wegen Sinus und Arcussinus, das bei dir jetzt ganz fehlt? Wie wäre es so? :zwinker:
C#-Quelltext
1:
| double WinkelBeta = Math.Asin(bsb * Math.Sin(WinkelAlpha) / bsa); |
interessierter - Mi 09.05.12 21:18
Vielen Dank.
Das Ergebnis von
C#-Quelltext
1:
| double WinkelBeta = Math.Asin(bsb * Math.Sin(WinkelAlpha) / bsa); |
habe ich anschliessend wieder in Grad umgerechnet und siehe da, ich hatte das richtige Ergebnis in der WriteLine :)
Jetzt ist mir auch der Fehler in der Formel klar. Ich habe nur den Wert von WinkelAlpha für die Berechnung benutzt, ohne zu definieren dass der Wert von WinkelAlpha ein Winkel (Sin) ist.
Ich möchte folgend noch den Codeblock posten. Vielleicht hat ja wiedermal jemand Probleme bei dieser Aufgabenstellung.
Die Aufgabe:
Bekannt sind zwei Seiten eines Dreiecks und der der grösseren Seite gegenüberliegende Winkel. Nun muss der der kleineren Seite gegenüberliegende Winkel berechnet werden.
Hier der Code dazu:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) {
Console.WriteLine("wieviel grad misst der bekannte Winkel?"); string Winkel = Console.ReadLine(); double bekannterWinkel = double.Parse(Winkel); double WinkelAlpha = bekannterWinkel / 180 * Math.PI; Console.WriteLine(WinkelAlpha); Console.WriteLine("bekannte seite a?"); string x = Console.ReadLine(); float bsa = float.Parse(x); Console.WriteLine("bekannte seite b?"); string y = Console.ReadLine(); float bsb = float.Parse(y); double WinkelBeta = Math.Asin(bsb * Math.Sin(WinkelAlpha) / bsa);
WinkelBeta = WinkelBeta * 180 / Math.PI; Console.WriteLine(WinkelBeta); }
} } |
Grüsse
interessierter
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!