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?");
// Bis hier die nötigen Abfragen

doublex = Math.Asin(bekannteSeiteb * WinkelAlpha / bekannteSeitea);
//Hier sollte nun x dem Wert Arcus Sinus entsprechen

double WinkelBeta = (Math.PI / 180) * x);
//Hier findet meiner Meinung nach die Umwandlung auf Bogenmass statt.

Console.WriteLine(WinkelBeta);
//Hier sollte der umgewandelte Wert von WinkelBeta ausgegeben werden.


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

user profile iconinteressierter hat folgendes geschrieben Zum zitierten Posting springen:
Von der formel her stimmt.
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 user profile iconTh69 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); // bsa = bekannte Seite a

            Console.WriteLine("bekannte seite b?");
            string y = Console.ReadLine();
            float bsb = float.Parse(y); // bsb = bekannte Seite b

            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; // Umrechnung von Grad in Bogenmass
           Console.WriteLine(WinkelAlpha);
           
           Console.WriteLine("bekannte seite a?");
           string x = Console.ReadLine();
           float bsa = float.Parse(x); // bsa = bekannte Seite a

           Console.WriteLine("bekannte seite b?");
           string y = Console.ReadLine();
           float bsb = float.Parse(y); // bsb = bekannte Seite b

           double WinkelBeta = bsb * WinkelAlpha / bsa;

           WinkelBeta= WinkelBeta * 180 / Math.PI; // Umrechnung von Bogenmass in Grad

           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...
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
--> β = asin(b * sin(α) / a)
user profile iconinteressierter hat folgendes geschrieben Zum zitierten Posting springen:

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)
        {
// Thema Trigonometrie: C# berechnet Winkelgrade nicht in Grad sondern in Bogenmass. Deswegen muss man die Winkel zuerst in Bogenmass umrechnen. Am Schluss muss man das Bogenmass der gesuchten Lösung wieder in Grad umwandeln um das gewünsschte Ergebnis zu erhalten.

 Console.WriteLine("wieviel grad misst der bekannte Winkel?");
           string Winkel = Console.ReadLine();
           double bekannterWinkel = double.Parse(Winkel);
           double WinkelAlpha = bekannterWinkel / 180 * Math.PI; // Umrechnung von Grad in Bogenmass
           Console.WriteLine(WinkelAlpha);
           
           Console.WriteLine("bekannte seite a?");
           string x = Console.ReadLine();
           float bsa = float.Parse(x); // bsa = bekannte Seite a

           Console.WriteLine("bekannte seite b?");
           string y = Console.ReadLine();
           float bsb = float.Parse(y); // bsb = bekannte Seite b

           double WinkelBeta = Math.Asin(bsb * Math.Sin(WinkelAlpha) / bsa);

           WinkelBeta = WinkelBeta * 180 / Math.PI; // Umrechnung von Bogenmass in Grad

           Console.WriteLine(WinkelBeta); // Der der kleineren  Seite gegenüberliegende Winkel

       }

    } 
}


Grüsse
interessierter