# Funktionen berechnen in Java



## nofear87 (2. Jun 2009)

Hallo,
wir sollen für ein Projekt drei Methoden zur Berechnung der Fläche unter der Kurve erstellen(Integral), an die dann die jeweilige Funktion als Parameter übergeben werden soll. Nun ist die Frage, ob ich nicht irgendwie drum herum komm, die Funktion als String zu übergeben und diesen dann umständlich auswerten muss. Bietet Java da irgedwas, was das rechnen von Funktionen erleichtert o.ä?
MfG Robert


----------



## ff (2. Jun 2009)

du müsstest einen string mit der funktion erhalten und den selber parsen (macht meist nicht viel spass). viel einfacher wäre es doch, wenn du einfach die nötigen parameter bekommst und damit rechnerst. für eine kubische funktion zB.

public double myCurve(float a, float b, float c, float d, float intervalStart, float intervalEnde){
 //dein integrator
}


----------



## Marco13 (2. Jun 2009)

Und für eine nicht-kubische? :autsch:

```
interface Function
{
    float f(float x);
}

...
interface Integrator
{
    float integrate(Function f, float x0, float x);
}
```


----------



## nofear87 (2. Jun 2009)

danke ersteinmal

ich muss das ganze für folgende funktionen machen:

1. -0,01x²+0,2x+5
2. (sin(x)*cos(x)) / x

kann man irgendwo genaueres über integrate finden?
weiß nämlich nicht viel mit den parametern der funktion anzufangen (also für was sie jetz genau stehen)
mfg robert


----------



## Marco13 (2. Jun 2009)

Wenn man eine Websuche nach "integral" macht, findet man bestimmt das eine oder andere. An sich ist da keine Zaberei dabei: f ist die Funtion, x0 der linke und x1 der rechte Rand.

```
float result = 0;
for (x = x0; x<x1; x+=irgendeineKleineSchrittweite)
{
    float y = function.f(x);
    float area = irgendeineKleineSchrittweite * y;
    result += area;
}
```
Jooo.. und das war's dann eigentlich schon. Ggf. solltest du die Frage präzisieren.


----------



## nofear87 (2. Jun 2009)

ok...ich präzisiere mal
und zwar haben wir drei verfahren vorgegeben. einmal die rechteckformel, die trapezformel und die simpsonsche regel.
diese liegen in mathematischer form vor und sollen nun in jeweils eine methode gepackt werden.

an diese methoden sollen dann die 2 genannten gleichungen übergeben werden.

an sich denke ich das mir das letzte von dir weiterhilft, nur eine frage habe ich noch dazu, statt function(x) könnte ich jetzt einfach auch function(x²+2) nehmen?

danke, lg robert


----------



## Michael... (2. Jun 2009)

nofear87 hat gesagt.:


> statt function(x) könnte ich jetzt einfach auch function(x²+2) nehmen?


Marco13's Vorschlag war ein Interface zu verwenden. Diese defininiert eine Methode f(float x) die Implementierung musst Du dann machen für die Funktion 2x sähe das in etwa so aus:

```
public float f(float x) {
    return 2*x;
}
```


----------



## Marco13 (2. Jun 2009)

... und der Integrator oben wäre die "Rechteckformel"...


----------



## nofear87 (2. Jun 2009)

danke...werds probieren...meld mich dann noch einmal


----------



## nofear87 (2. Jun 2009)

könnt ihr mir bitte nocheinmal weiterhelfen?


```
result = (double) ((Math.sin(x)*Math.cos(x))/x);
```

liefert bei mir immer nur 0,00 woran könnte das liegen?
habs mal mit "1" aufgerufen, müsste eigentlich 0.01744 heruaskommen.
Gibts da unterschiede zwecks Bogenmaß etc, wenn ja wie bügel ich diese aus?
Würde gerne mit DEG rechnen (soheißts zumindest auf meinem taschenrechner *fg)

Gruss Robert


----------



## Marco13 (2. Jun 2009)

0 sollte da nicht rauskommen, Poste ggf. mal compilierbaren(!) Code. Ansonsten hilft Math.toRadians dir vielleicht noch. Hoffentlich sieht das Andrey ncht


----------



## faetzminator (2. Jun 2009)

von welchem Typen ist x?


----------



## nofear87 (3. Jun 2009)

```
public static double f(double x, int i) {
		double result = 0;
		if(i == 1){
			result = (double) (-0.01*x*x+0.2*x+5);
		} else if(1 == 2){
			result = (double) ((Math.sin(x)*Math.cos(x))/x);
		}
		System.out.println(result);
		return result;
	}
	
	public static void main(String[] args) {
		f(1,2);
		//rechteckformel(0,100,20,2);
		
	}
```


----------



## Michael... (3. Jun 2009)

nofear87 hat gesagt.:


> ```
> public static double f(double x, int i) {
> double result = 0;
> if(i == 1){
> ...


Ist das wirklich der Code, wie Du ihn in Deinem Programm verwendest? Dann schau Dir mal Zeile 5 an.
1 wird nämlich niemals gleich 2 sein;-)


----------



## nofear87 (3. Jun 2009)

ui...sollte natürlich ein "i" sein statt der "1". man sollte sowas halt nich so spät machen xD
trotzdem gibt Math.sin die werte im bogenmaß zurück, so dass das ergebniss dennoch nicht mit dem auf dem taschenrechner übereinstimmt (DEG)
wie kann ich das ändern?


----------



## Michael... (3. Jun 2009)

Entweder selbst umrechnen oder Math.toDegrees() verwenden.


----------



## nofear87 (3. Jun 2009)

```
double y = Math.sin(1);
		y = Math.toDegrees(y);
		System.out.println(y);
```

irgendwie liefert das immer noch andere werte als mein Taschenrechner...stell ich mich wieder dumm an?

TR : 0.0174
Programm: 48.21273601220948


----------



## Civilazi (3. Jun 2009)

Du berechnest da nicht sin(1°), sondern sin(1). 
Math.sin() erwartet ein Argument im Bogenmaß, müsstest du also umrechnen, dann kommst du auch zu dem Taschenrechnerergebnis.
Das Ergebnis umrechnen ist natürlich Quatsch, überleg nochmal, von wo nach wo der sin abbildet


----------



## nofear87 (3. Jun 2009)

```
double x = Math.toRadians(1);
		System.out.println(x);
```

so sozusagen...vielen dank!


----------

