mboost-dp1

c++ formel


Gå til bund
Gravatar #1 - Longio
6. dec. 2010 16:55
Hej mennesker
Jeg har en en formel som skal bruges i c++. Det er denne.
Xn+1=Xn-((f(xn))/(f '(xn)))


problemet er bare den skal lave det mange gange med nyt input altså det som den udregnede forige gang

Hvordan kan jeg gøre dette? Bare lidt kode ville hjælpe mig med at komme igang.
Gravatar #2 - Daniel-Dane
6. dec. 2010 17:17
Et for-loop?
Gravatar #3 - jens_ond
6. dec. 2010 17:53
Gravatar #4 - Longio
6. dec. 2010 19:28
#2

Ja et slags for loop. Men Hvis den i første regning få 2, så skal den i næste regning bruge dette 2 tal for at regne videre.
Lidt ligesom henons attracktor :P
Gravatar #5 - tazimn
6. dec. 2010 19:33
What #3 said..
Gravatar #6 - Daniel-Dane
6. dec. 2010 19:33
Hvis han kan optimere den til tail-recursion.
Gravatar #7 - arne_v
6. dec. 2010 19:33

double res = STARTVAL;
double oldres;
do
{
oldres = res;
res = res - f(res)/fderiv(res);
}
while(fabs(res - oldres) > SMALL);
Gravatar #8 - onetreehell
6. dec. 2010 20:04
Din ligning ser mærkelig ud ((dobbelt parentens, wtf)). Er det sådan her den skal forstås? http://mathbin.net/56392

Gravatar #9 - arne_v
6. dec. 2010 20:08
#8

Jeg har ihvertfald antaget at det er en helt standard nul punkts finder med Newton's metode.
Gravatar #10 - onetreehell
6. dec. 2010 20:24
#9
haha, det havde jeg ikke set :)
Der er nogle problemer ved at gøre det på den måde. Man bruger jo floating point tal, der har forskellig præcision alt efter om man er tæt på nul eller langt væk*. Så vidt jeg husker, så lærte jeg at man skulle vente indtil man er inde i en cykel.
Gravatar #11 - Longio
6. dec. 2010 20:27
#9

Det er korrekt, det er hvad du siger. og #8 ja den skal forstås sådan som du skrev den. Jeg kom vidst til at skrive for mange paranteser.

#7

Er det så den kode jeg kan bruge eller vil der ske problemer?
Gravatar #12 - arne_v
6. dec. 2010 20:28
#10

Hvis kontekst er sådan at der er stor forskelle på 0.0000000000001 og 0.0000000000002, så skal man til at teste på relativ forskel.

I en del sammenhænge er den absolutte forskel godt nok.
Gravatar #13 - arne_v
6. dec. 2010 20:30
#11

Der er en del krøller:
- hvordan meget små værdier skal betragtes jævnfør #10 & 12
- valg af startværdi og hvornår den faktisk konvergerer i.s.f. at divergere

Men prøv og start med den kode.
Gravatar #14 - Longio
6. dec. 2010 20:31
#12

Jamen det er der ikke. Det er mere til et lille matematik projekt. Så mangler vi som gruppe kun at lave programmet, men jeg har haft en del problemer da jeg har taget det helt anderledes an. Mange tak for hjælpen :)
Gravatar #15 - Longio
6. dec. 2010 20:32
#13

Jamen som sagt, så skal programmet kun laves så man kan se et eksempel hehe. Det skal ikke regne 100 % præcist. Man jeg vil bruge koden som du skrev.

Edit

Hvis det kan hjælpe så skal jeg bestemme nulpunkt for

f(x):=10^-x-10

g(x):=10^(-x)-1/10
Gravatar #16 - onetreehell
6. dec. 2010 20:39

double t_res = STARTVAL;
double h_res = STARTVAL;
double t_oldval, h_oldval;

/* Evt. kan man bruge følgende således:
* t_res = next(t_res); */
#define next(r) ((r)-f(r)/fderiv(r))

i = 1;
do {
if (i%2==0) {
i++;
t_oldval = t_res;
t_res = t_res - f(t_res)/fderiv(t_res);
}
h_oldval = h_res;
h_res = h_res - f(h_res)/fderiv(h_res);
} while (h_res != t_res);


Jeg ved ikke om det er fornuftigt...

algoritmen til at finde cyklen:
http://en.wikipedia.org/wiki/Cycle_detection#Torto...

meh, jeg bruger slet ikke oldval...
Gravatar #17 - onetreehell
6. dec. 2010 20:55
#16
Jeg burde tænke mig lidt om :P


double t_res = STARTVAL;
double h_res = STARTVAL;

/* Evt. kan man bruge følgende således:
* t_res = next(t_res); */
#define next(r) ((r)-f(r)/fderiv(r))

i = 1;
do {
if (i%2==0) {
t_res = next(t_res);
}
h_res = next(h_res);
i++;
} while (h_res != t_res);
#undef next
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login