Sinus bei Java

Hi, ich habe folgende Probleme :

wie kann ich in Java sin(x*y) lösen?

z.B

double a = sin(x*y)

was ist das Ergebnis von x?

also möchte ich x nach a und y auflösen

Wie kann es ich umformulieren?
 
S

Spacerat

Gast
Hmmm... [c]sin(alpha)= a/c[/c]... eigentlich.
Also wenn bei dir a und y gegeben sind, dann müsste [c]x = asin(a) / y[/c] passen.
 

Hobbes

Aktives Mitglied
Und immer daran denken, dass Java das Bogenmaß nutzt. Außerdem ist die Umkehrung des sinus nicht eindeutig. Deshalb gilt immer -pi/2 <= asin(x) <= pi/2. Wenn man das Ergebnis aus einem anderen Intervall möchte, muss man von Hand verschieben.
 
S

Spacerat

Gast
@algebraiker: äehm... wiebidde? wo kommt denn bei dir y ins Spiel?
@Hobbes: Eben...
Und dann scheint's noch ein Problem mit Rundungsfehlern zu geben:
Java:
double x1 = 60 * PI / 180;
double y1 = 90 * PI / 180;
double a1 = 60 * 90 * PI / 180;
double a = sin(x1 * y1);
double a2 = sin(a1);
double x = asin(a) / y1 * 180 / PI;
double x2 = asin(a2) / y1 * 180 / PI;
System.out.println(x);
System.out.println(x2);
Code:
Ausgabe:
54.59155902616467
1.251656353643586E-13
Java:
double x1 = 61 * PI / 180;
double y1 = 90 * PI / 180;
double a1 = 61 * 90 * PI / 180;
double a = sin(x1 * y1);
double a2 = sin(a1);
double x = asin(a) / y1 * 180 / PI;
double x2 = asin(a2) / y1 * 180 / PI;
System.out.println(x);
System.out.println(x2);
Code:
Ausgabe:
53.59155902616465
57.29577951308232
 
Zuletzt bearbeitet von einem Moderator:
S

Spacerat

Gast
Immer locker bleiben. Ich hatte mich verschrieben.
Aber des passt immer noch nicht... bei dir kommt beide male NaN raus. Bei mir dagegen jedenfalls schon beinahe wieder 60. Ok... warum beim ersten Beispiel das 2. Ergebnis ungefähr 0 ist, bleibt mir auch ein Rätsel. Fakt ist aber, dass ich aus a zunächst erstmal wieder einen Winkel (zwischen -90° und 90°) mache und diesen dann durch den verbliebenen (y1) teile. Fakt ist ebenso, dass der gesuchte Winkel (x) auf die Art nur Modular wiederhergestellt werden kann, maw. nicht unbedingt den Eingangswert von x hat.
 

algebraiker

Aktives Mitglied
Mehr als die richtige Umformung kann ich mathematisch auch nicht geben.

Der arcsin ist als Umkehrfunktion des Sinus im Bereich [-pi/2, pi/2] mit dem Bild [-1,1] definiert. Der arcsin als Umkehrfunktion im Bereich [-1,1] mit dem Bild im kompakten Intervall [-pi/2, pi/2].

Das kann man auch beweisen.
 
S

Spacerat

Gast
Doch passt. Dein Code ist falsch, mach mal eine Einheitenkontrolle. Bei 60*90 Grad kommt 0 raus, weil sin(60*90) eben 0 und arcsin(0) = 0 ist.
Hmm... 'ne Einheitenkontrolle kann ich bei den Gegebenheiten kaum herleiten. Welcher Teil von [c]x*y[/c] ist der Winkel und welcher der einheitenlose Faktor? Was ich aber herleiten kann ist folgendes:
Code:
Gegeben:
a, y und eine Formel a=sin(x*y)
Gesucht:
x
Die entgegengesetzte Sinusfunktion ist der arcsin, deswegen:
x*y = arcsin(sin(x*y)) bzw. x*y=arcsin(a);
Daraus folgt:
x=arcsin(a)/y
Das einzige, wovon ich nicht wirklich überzeugt bin ist, ob vllt. nur ein Wert von x und y ins Bogenmaß gebracht werden muss, denke aber schon.
Java:
import static java.lang.Math.*;

public class Sin
{
	public static void main(String[] args)
	{
		final double y = 90;
		for(int x = 60; x < 64; x++) {
			double a = calc(x, y);
			System.out.println((asin(a) / y) * (180 / PI));
		}
	}

	private static double calc(final double x, final double y)
	{
		return sin((x * y) * (PI / 180.0));
	}
}
Code:
Ausgabe:
2.1845524474587094E-15
1.0
4.67859430964718E-15
-1.0
So leuchtet mir das zumindest ein. Aber ich lass mich auch vom anderen überzeugen. @algebraiker: Auf deine Umstellung der Formel bin ich ja mal gespannt.
 
S

Spacerat

Gast
Unsere unterschiedlichen Ergebnisse.
Meines:[c]x = arcsin(a) / y[/c]
Deines:[c]x = arcsin(y) / a[/c]
Ich kann dein Ergebnis nicht nachvollziehen. Zu meinem komme ich über die Herleitung im vorhergehenden Post. Mein Ergebnis aber soll falsch sein. Warum?
 
Zuletzt bearbeitet von einem Moderator:

algebraiker

Aktives Mitglied
Es gilt in der Tat
Code:
x = (sin^(-1)(a))/y

Da die Umkehrfunktion von sin eben arcsin mit der von mir oben erwähnten Einschränkung auf [-1,1] bzw. [-pi/2, pi/2] ist, bekommt man

Code:
x = arcsin(a) / y

Alles andere ist nunmal falsch. (Sorry)

Ziemlich trivial kann man sich das so herleiten. Sei der sin auf [-1,1] beschränkt, dann gilt:

a = sin(x*y) =>
sin^(-1) (a) = x*y =>
x = (sin^(-1)(a))/y
 
S

Spacerat

Gast
@algebraiker: Puh... da hab' ich ja noch mal Glück gehabt... und du dich gleich 2x verschrieben. Naja, sowas kommt vor. ;) Nu' ist jedenfalls alles klar.
 

Neue Themen


Oben