Funktion mit While-Schleife < Mathematica < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 12:47 Fr 27.02.2009 | Autor: | PaRu |
Ich habe eine Funktion, die eine Summe beinhaltet. Leider kenne ich das Ende der Summenlaufvariable nicht, da es von dem Funktionswert abhängt, der an die Abbruchbedingung geknüpft ist. Das ganze soll dann so aussehen:
[mm] f(x)=\sum_{y=1} y + x [/mm] solange [mm]10 > \sum_{y=1} y + x[/mm]
Anbei auch mein bisheriger Quellcode, der aber nicht funktioniert.
Dateianhänge: Anhang Nr. 1 (Typ: nb) [nicht öffentlich]
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:13 Fr 27.02.2009 | Autor: | abakus |
> Ich habe eine Funktion, die eine Summe beinhaltet. Leider
> kenne ich das Ende der Summenlaufvariable nicht, da es von
> dem Funktionswert abhängt, der an die Abbruchbedingung
> geknüpft ist. Das ganze soll dann so aussehen:
> [mm]f(x)=\sum_{y=1} y + x[/mm] solange [mm]10 > \sum_{y=1} y + x[/mm]
>
> Anbei auch mein bisheriger Quellcode, der aber nicht
> funktioniert.
Hättest du den Anhang als Textdatei genommen, könnten es viele lesen (ich kann es nicht).
Vom Prinzip (kenne Mathematica nicht) müsste es so ablaufen:
...
y=1
S=0
Do
S=S+x+y
y=y+1
WHILE S+x+y<10
Gruß Abakus
|
|
|
|
|
Moin,
ich hoffe, dass du in deinem Profil mit "Naturwiss.-Student im Hauptstudium" gelogen hast. Mir ist naemlich nicht klar, fuer was du bei diesem Problem eine Funktion brauchst. Vielleicht habe ich aber auch einfach deine Frage nicht verstanden.
Wenn x eine reelle Zahl ist, dann sollte man in der Lage sein die Summe
[mm] \summe_{y=1}^{n} [/mm] y+x
auszurechnen. Das ergibt
[mm] \bruch{1}{2}(n+n^2+2nx)
[/mm]
Du moechtest jetzt, dass dieser Ausdruck kleiner 10 ist und willst dafuer das n wissen. Also nimmt man die Ungleichung und stellt sie um.
10 > [mm] \bruch{1}{2}(n+n^2+2nx)
[/mm]
Nun sind wir aber einmal im Mathematica Forum:
1: | eq = 10 > Sum[x + y, {y, 1, n}];
| 2: | sol = Reduce[eq && n > 0, n, Reals]
|
0 < n < [mm] \bruch{1}{2} \wurzel{4 x^2 + 4 x + 81} [/mm] + [mm] \bruch{1}{2} [/mm] (-2 x - 1)
Setzt man jetzt fuer x zb 0.23 ein, dann erhaelt man n<3.801, also 3. Und tatsaechlich ergibt die Summe bis n=3 s=6.69, wohingegen s=10.92 wenn bis n=4 summiert wird.
Cheers
Patrick
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:15 So 01.03.2009 | Autor: | PaRu |
@ abakus
wie man sowas prinzipiel programiert, weiß ich. in matlab wäre das alles kein problem. die frage zielt speziell auf eigenheiten von mathematica ab. daher auch das notebook-file.
@ halirutan
das mit dem "Naturwiss.-Student im Hauptstudium" ist nicht gelogen. aber evtl. ist das eigentliche problem wesentlich komplexer, bei dem sich die summe nicht so einfach lösen lässt und ich hab nur ein sehr einfaches beispiel gewählt?
das ganze muss unbedingt eine funktion sein, da das ergebnis in abhänigkeit von x für diverse berechnungen herhalten muss. desweiteren ist die abbruchbedingung etwas anders. im quelltext hab ich es richtig gemacht, aber im thread falsch beschrieben: wenn der summand des aktuellen laufwerts größer als 10 ist, sollen keine weiteren summanden auf die summe addiert werden und die summe soll bis zu dem entsprechendem laufindex als funktionswert zurück gegeben werden.
|
|
|
|
|
Moin,
ohne Genaueres ueber das dahinterliegende Problem zu wissen ist es schwierig eine gute Loesung vorzuschlagen. Die absolut dumme Variante ist
1: | summe[x_, n_] := Sum[k + x, {k, 1, n}];
| 2: | f[x_] := summe[x, NestWhile[#1 + 1 & , 1,
| 3: | summe[x, #1] < 10 & ]]
|
das summiert einfach erst bis 1, dann bis 2, dann bis 3 etc. und schaut immer, ob die Summer groesser 10 ist. Falls nicht macht es weiter, falls doch, dann gibt es die *aktuelle* Summe zurueck.
Das ist natuerlich eine sehr schlechte Variante, wenn es sich bei deiner Summe wirklich um etwas Komplexeres handelt.
Cheers
Patrick
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:21 Di 03.03.2009 | Autor: | PaRu |
@ halirutan
danke erst einmal. das ist was ich brauchte und die lösung ist auch recht optimal, da in zeile 3 nicht "summe[x, #1] < 10" sondern "x + #1 < 10" stehen muss und somit die summe nur einmal ausgeführt wird.
und um es ganz korrekt zu machen, muss da "NestWhile[ ... ] - 1" stehen.
|
|
|
|