Zdravím, zaseknul jsem se u jedné chyby při psaní programu. Chci předat funkci pole jako parametr, což by měla být jednoduchá záležitost a postupuji stejně jako zde: http://www.cplusplus.com/…rial/arrays/ . Našel jsem sice dotazy ohledně stejné chybové hlášky na anglických stránkách, ale jejich řešení nebo důvod, proč k tomu došlo, mi nepřijde aplikovatelný na mojí situaci. Mohl byste mi někdo poradit co s tím? Kdyby to někoho zajímalo, tak se jedná o řešení rovnice geodetiky z obecní teorie relativity ve Schwarzshildově metrice pomocí numerické metody Runge-Kutta čtvrtého řádu. Vím, že kód je zatím neefektivní, vylepšovat to budu, až bude funkční. Díky za odpověď.
#include <cstdlib>
#include <iostream>
#include <math.h>
using namespace std;
// c=1, G=1
const double PI = 3.1415926535;
const int Dim = 4;
const double M=1; //hmotnost v geometrizovaných jednotkách
typedef double IVektor[Dim]; // vlastni typ pro predavani ve funkcich
void derivs (double x[Dim], double v[Dim], double &dx, double &dv, int a) {
double r = x[1];
double theta = x[2];
double g = (1.0-2.0*M/r);
if(g<=0) {
cout << "HORIZONT!" << g;
exit(1);
}
dx = v[a];
switch(a) {
case 0:
dv= -2.0*M/(r*r)/g*v[0]*v[1];
break;
case 1:
dv= -2.0*M/(r*r)*g*v[0]*v[0]+M/(r*r*g)*v[1]*v[1]+(r-2*M)*v[2]*v[2]+(r-2*M)*sin(theta)*sin(theta)*v[3]*v[3];
break;
case 2:
dv= -2.0/r*v[1]*v[2]+sin(theta)*cos(theta)*v[3]*v[3];
break;
case 3:
dv= -2.0/r*v[1]*v[3]-2.0*cos(theta)/sin(theta)*v[2]*v[3];
break;
}
}
void RK4 (void derivs(double , double , double &, double &, int), IVektor &x, IVektor &v, double dt) {
IVektor dx1,dx2,dx3,dx4,dv1,dv2,dv3,dv4; // 4vektory pro vypocet
double p[Dim], q[Dim]; // pomocna pole pro predani parametrem
int i,j;
for(j = 0; j < Dim; j++) {
p[j]=j;
q[j]=j;
}
for(i=0; i<Dim; i++) derivs(p,q,dx1[i],dv1[i],i); // zde je prvni chyba // a pak u dalsich volani derivs()
for (j = 0; j < Dim; j++) {
p[j]=x[j]+0.5*dt*dx1[j];
q[j]=v[j]+0.5*dt*dv1[j];
}
for (i = 0; i < Dim; i++) derivs(p,q,dx2[i],dv2[i],i);
for (j = 0; j < Dim; j++) {
p[j]=x[j]+0.5*dt*dx2[j];
q[j]=v[j]+0.5*dt*dv2[j];
}
for (i = 0; i < Dim; i++) derivs(p,q,dx3[i],dv3[i],i);
for (int j = 0; j < Dim; j++) {
p[j]=x[j]+dt*dx3[j];
q[j]=v[j]+dt*dv3[j];
}
for (i = 0; i < Dim; i++) derivs(p,q,dx4[i],dv4[i],i);
for (i = 0; i < Dim; i++) {
x[i]+=dt*(dx1[i]+2*(dx2[i]+dx3[i])+dx4[i])/6;
v[i]+=dt*(dv1[i]+2*(dv2[i]+dv3[i])+dv4[i])/6;
}
}
int main(int argc, char *argv[])
{
IVektor x,v;
//pocatecni podminky
x[1] = 10; // souradnice v r
x[2] = PI/2;
x[3] = 0; // souradnice v fi
x[0] = 0; // souradnice v case
double g1 = (1-2.0*M/x[1]);
v[1] = 0; // rychlost v r
v[2] = 0;
v[3] = 0.065; // rychlost v fi
v[0] = sqrt(1.0/g1+v[1]*v[1]/(g1*g1)+x[1]*x[1]*v[2]*v[2]/g1+x[1]*x[1]*v[3]*v[3]*sin(x[2])*sin(x[2])/g1); // rychlost v case
double tau = 0;
double dtau = 1.0/1000;
int a = 0;
while (tau<100) {
if (a % 1000 == 0) cout << tau << " " << x[1]*cos(x[3]) << " " << x[1]*sin(x[3]) << " " << v[1] << endl;
RK4(derivs,x,v,dtau);
tau+=dtau;
a++;
}
return EXIT_SUCCESS;
}