Witam,
posiłkując się tym ćwiczeniem - http://ww2.odu.edu/~agodunov/computing/programs/cpp/ode02.cpp - napisałem programik. Jednak tak jak widać na dole, autorowi zwraca dobre wartości, mnie natomiast same 0.
Myślę że błąd leży w deklaracji funkcji a potem przekazaniu argumentu ale mogę się mylić także jakby ktoś rzucił na to profesjonalnym okiem i pomógł naprawić mi błąd to byłbym wdzięczny.
Gdy chcę zadeklarować funkcję w taki sposób jak autor to dostaję błąd - parameter name omitted, expected ).
Mianowicie chodzi o ten fragment
double rk4_2nd(double(*d1x)(double, double, double), double(*d2x)(double, double, double),double ti, double xi, double vi, double tf, double& xf, double& vf)
Gdy usunąłem & to dostawałem cały czas 0,0...
Kod autora widać na górzę w linku, mój wrzucam poniżej - może jest inna przyczyna niż deklarowanie tej funkcji dlaczego dostaje same zera? Pozdrawiam i proszę o pomoc
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//definition of x'(t) which is f1(t,x,x') = x' by definition (velocity)
double f1(double t, double x, double v)
{
double d1x;
d1x = v;
return d1x;
}
//definition of x''(t)=f2(t,x,x') which is acceleration;
double f2(double t, double x, double v)
{
double d2x;
d2x = -1*x;
return d2x;
}
double rk4_2nd(double(*d1x)(double, double, double), double(*d2x)(double, double, double),double ti, double xi, double vi, double tf, double& xf, double& vf)
{
double h,t,k1x,k2x,k3x,k4x,k1v,k2v,k3v,k4v;
double xf, vf;
h=tf-ti;
t=ti;
k1x = h*d1x(t,xi,vi);
k1v = h*d2x(t,xi,vi);
k2x = h*d1x((t+h)/2, (xi+k1x)/2, (vi+k1v)/2);
k2v = h*d2x((t+h)/2, (xi+k1x)/2, (vi+k1v)/2);
k3x = h*d1x((t+h)/2, (xi+k2x)/2, (vi+k2v)/2);
k3v = h*d2x((t+h)/2, (xi+k2x)/2, (vi+k2v)/2);
k4x = h*d1x(t+h, xi+k3x, vi+k3v);
k4v = h*d2x(t+h, xi+k3x, vi+k3v);
xf = xi + ((k1x + 2*(k2x+k3x) + k4x)/6);
vf = vi + ((k1v + 2*(k2v+k3v) + k4v)/6);
return 0;
}
int main()
{
double ti,xi,vi,xf,vf,tf,dt,tmax;
ti = 0.0; //initial value for time variable
xi = 0.0;
vi = 1.0;
dt = 0.1;
tmax = 12.0;
printf("Please input initial displacement value (IT MUST BE DIFFERENT THAN 0)\n");
scanf("%lf", &xi);
printf("Please input initial velocity value\n");
scanf("%lf", &vi); //scanning for initial value of velocity
printf("Please input step size of integration (the less the better)\n");
scanf("%lf", &dt); //scanning for step size of integration (dt)
printf("Please input the maximum value of t till which the program should work\n");
scanf("%lf", &tmax); //scanning for the end of integration interval
while (ti<=tmax)
{
tf=ti+dt;
rk4_2nd(f1, f2, ti, xi, vi, tf, xf, vf);
printf("%lf\t\t\t\t\t%lf\t\t\t\t\t%lf", tf, xf, vf);
ti=tf;
xi=xf;
vi=vf;
}
return 0;
}