Programiranje c++ harmonicki oscilator

poruka: 7
|
čitano: 1.656
|
moderatori: XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
10 godina
neaktivan
offline
Programiranje c++ matematicko njihalo

znaci sljedeci program je za njihalo s gusenjem,stvar je u tome da dok sam ga radio nisam vidio gresku i sad nisan siguran kako je ispraviti,greska je u crti gdje je sljedece :              double yt[n],dy1[n],dy2[n],dy3[n]; te mi podcrtava n u zagradama i kaze "expresion must have a constant value".mozda je neka jednostavna greska al ja nemam pojma kako ovo rijesiti.zahvaljujem na odgovorima

 

 

 

 

// Matematičko njihalo s gušenjem i perodičnom vanjskom silom
#include <iostream>
#include <fstream>
#include <cmath>
#include <iomanip>

using namespace std;

double Q, A, w;

void Stuff (const double g, double m, double l, double wd, double a, double p, double *Tinit, double *Tfin)
{
    double w0=pow(g/l,0.5);
    w=wd/w0;
    Q=m*g/(w0*p);
    A=a/(m*g);
    *Tinit*=w0;
    *Tfin*=w0;
}

void Deriv (double t, double *y, double *dydt)
{
    dydt[0]=y[1];
    dydt[1]=-y[1]/Q-sin(y[0])+A*cos(w*t);       //Q,A i w su globalne varijable
}

void RK4 (double *y, double *dydt, double t, int n, double h,
          void (*Deriv)(double, double*, double*))
/*Runge-Kutta metoda, rjesava 1 korak za sustav n jednadzbi oblika dy/dt=f(t,y) preko relacije:
            y(ti+h)=y(ti)+1/6*(k1+2*k2+2*k3+k4);
                    k1=h*f(ti,y(ti)),
                    k2=h*f(ti+h/2,y(ti)+k1/2),
                    k3=h*f(ti+h/2,y(ti)+k/2),
                    k4=h*f(ti+h,y(ti)+k3)
*/
{
    double yt[n],dy1[n],dy2[n],dy3[n];
    double half_h=h/2, sixth_h=h/6;     //stedi procese za veliki broj jednadzbi

    //treba izracunati i spremiti svaki k posebno da bi ga se moglo iskoristiti za sljedece derivacije koje cemo na kraju koristiti...zalosno...
    for(int i=0; i<n; i++)
    {                                   // racuna se yt koji treba uvrstiti da se dobije k2
        yt[i]=y[i]+half_h*dydt[i];      // racuna yt+k1/2 koji je potreban za k2
    }
    (*Deriv)(t+half_h,yt,dy1);            // dobiveni yt se ubacuje u funkciju koja racuna derivaciju (dy1) pomocu koje se dobije k2

    for(int i=0; i<n; i++)
    {                                   // yt za k3
        yt[i]=y[i]+half_h*dy1[i];
    }
    (*Deriv)(t+half_h,yt,dy2);            //k3

    for(int i=0; i<n; i++)
    {                                   //yt za k4
        yt[i]=y[i]+h*dy2[i];
    }
    (*Deriv)(t+h,yt,dy3);            //k4

    for(int i=0; i<n; i++)
    {               //izračunati k-ovi se koriste da se dobije y(ti+1) Simpsonovim pravilom
        y[i]+=sixth_h*(dydt[i]+2*dy1[i]+2*dy2[i]+dy3[i]);
    }
}

int main()
{
    double t,x,v,m,l,wd,a,p;
    const int n=2;
    double Tinit=0, Tfin=25;
    const int N=1000;
    const double g=9.81;
    double y[n], dydt[n];

    cout << "Masa m=";
    cin >> m;
    cout << "Duljina njihala l=";
    cin >> l;
    cout << "Amplituda vanjske sile a=";
    cin >> a;
    cout << "Kutna frekvencija vanjske sile w=";
    cin >> wd;
    cout << "Koeficijent gusenja p=";
    cin >> p;

    Stuff(g,m,l,wd,a,p,&Tinit,&Tfin);

    cout << "Pocetni kut: ";
    cin >> x;
    cout << "Pocetna kutna brzina: ";
    cin >> v;

    ofstream  output;
    output.open("izlaz.txt");
    if(!output.is_open())
    {
        cout<<"Problem s otvaranjem"<<endl;
        return 1;
    }

    y[0]=x;
    y[1]=v;

    t=Tinit;
    output << "#" << setw(11) << "t" << setw(13) << "kut" << setw(13) << "w" <<endl;
    output << setw(13) << t << setw(13) << x << setw(13) << v <<endl;

    double h=(Tfin-Tinit)/N;
    //int br=1;
    while (t<Tfin)
    {
        Deriv(t,y,dydt);
        RK4(y,dydt,t,n,h,&Deriv);
        t+=h;
        //if(br%5==0)
            output<<setw(13) << t << setw(13) << y[0] << setw(13) << y[1] <<endl;
        //br++;
    }
    output.close();
    return 0;
}

 
0 0 hvala 0
14 godina
neaktivan
offline
Re: Programiranje c++ matematicko njihalo

Pri deklaraciji statičkog polja treba se navesti konstantan broj elemenata. Znači, konkretan broj. Zato će deklaracija poput

 

double y[n];

 

biti greška jer n je varijabla a ne konstanta. Ovaj pristup će biti moguć tek u C++14 standardu. S obzirom da tvoj prevoditelj očito ne podržava ova svojstva C++14 standarda (mislim da gcc i clang podržavaju) preostaje ti dinamička alokacija. Npr.

 

#include <memory>
using namespace std;

unique_ptr<double> y(new double[n]);  // dinamički alociraj y kao polje od n elemenata

 

A isto tako, možeš probati i sa vektorima.

 

 

10 godina
neaktivan
offline
Programiranje c++ harmonicki oscilator

ahaaa da da da kuzim fala :D

 
0 0 hvala 0
12 godina
offline
Re: Programiranje c++ harmonicki oscilator

Alternativa gornjim opcijama (dinamicka alokacija, stl vektori), i 'brzi fix' je da izvuces 'const int n, N' iz maina i stavis kao globalne varijable, kad ih vec imas par. U mainu je ok, jer su n,N konstante, ali kad proslijedis u funkciju kao parametre, onda vise nije ok.

10 godina
neaktivan
offline
Re: Programiranje c++ harmonicki oscilator

a probao sam to,al opet mi javlja istu gresku,nije mi jasno zasto.mislim postavim n da je konstanta i globalna varijabla pa mi opet kaze za yt[n] da n mora biti konstantan... -.- u čemu je stvar

 

14 godina
neaktivan
offline
Re: Programiranje c++ harmonicki oscilator

Što si točno probao. Napiši.

10 godina
neaktivan
offline
Re: Programiranje c++ harmonicki oscilator

ipak sve ok,uspio sam riješiti problem,TracerCpp uzeo sam tvoj savjet,stalno sam radio istu grešku, n mi je stalno bila varijabla -.- ugl.uspio sam,tako zahvaljujem vam se svima na pomoci :D pozdrav

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice