# Sinus bei Java



## aldimeola1122 (31. Dez 2011)

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?


----------



## emailundlos (31. Dez 2011)

gute frage, das geht nur mit den künsten der mathematik, ...


----------



## Spacerat (31. Dez 2011)

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.


----------



## aldimeola1122 (31. Dez 2011)

das stimmt aber nicht, 

z.B 

sin(60 * 90) = 0.387364812

arcsin(0.387364812) / 90  = *0.00441968357*


----------



## algebraiker (31. Dez 2011)

Sei a ungleich null, dann ist a = sin(x*y) aufgelöst nach x:

x = arcsin(y) / a


----------



## Hobbes (31. Dez 2011)

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.


----------



## Spacerat (31. Dez 2011)

@algebraiker: äehm... wiebidde? wo kommt denn bei dir y ins Spiel?
@Hobbes: Eben...
Und dann scheint's noch ein Problem mit Rundungsfehlern zu geben:
	
	
	
	





```
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);
```


```
Ausgabe:
54.59155902616467
1.251656353643586E-13
```


```
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);
```


```
Ausgabe:
53.59155902616465
57.29577951308232
```


----------



## algebraiker (31. Dez 2011)

Immer locker bleiben. Ich hatte mich verschrieben.


----------



## Spacerat (31. Dez 2011)

algebraiker hat gesagt.:


> 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 (31. Dez 2011)

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.


----------



## gasssst (31. Dez 2011)

Spacerat hat gesagt.:


> Aber des passt immer noch nicht...



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.


----------



## Spacerat (1. Jan 2012)

gasssst hat gesagt.:


> 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:

```
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.
	
	
	
	





```
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));
	}
}
```


```
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.


----------



## algebraiker (2. Jan 2012)

Was genau ist dein Problem bei der Umstellung der Formel? Ich sehe da keins.


----------



## Spacerat (2. Jan 2012)

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?


----------



## algebraiker (2. Jan 2012)

Es gilt in der Tat 
	
	
	
	





```
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


```
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


----------



## Spacerat (2. Jan 2012)

@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.


----------



## algebraiker (2. Jan 2012)

Ja, komischerweise habe ich mich gleich 2 x verschrieben. So oft kommt das nun wirklich nicht vor.


----------

