Tényleg nem létezik?
  • sublimiter
    #1344
    1.215947e-04
    2.432175e-04
    2.000232e+00

    Lol, a kapott szog ketszerese a newtoninak, pedig csak a fenysebesseg kiszamolasahoz hasznaltam az egyik Schwarzschild egyenletet, mit nemreg linkeltem.

    A progi a fenti egyenlettel szamolja a feny iranyvaltozasat, tehat fenytorest szammol.
    dpx2 = dpx *c2*c2/(c1*c1);
    Ennyi.

    Vagyis nem egeszen. Tomeggel rendelkezo testre fenyszeru belso mozgasokat kell szamolni. Ez hazi feladat. Az eredmeny tobb, mint meglepo. Nem en fogom leirni a megoldast.


    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>




    typedef long double skalar;



    struct vektor
    {
    skalar x,y,z;

    vektor() {x=0;y=0;z=0;};
    vektor(int x_,int y_,int z_) {x=x_;y=y_;z=z_;};
    vektor(skalar x_,skalar y_,skalar z_) {x=x_;y=y_;z=z_;};

    vektor operator + (vektor v) {vektor v_;v_.x=x+v.x;v_.y=y+v.y;v_.z=z+v.z;return v_;};
    vektor operator - (vektor v) {vektor v_;v_.x=x-v.x;v_.y=y-v.y;v_.z=z-v.z;return v_;};
    vektor operator * (skalar s) {vektor v_;v_.x=x*s;v_.y=y*s;v_.z=z*s;return v_;};
    vektor operator / (skalar s) {vektor v_;v_.x=x/s;v_.y=y/s;v_.z=z/s;return v_;};
    };

    skalar skalar_szorzat(vektor v1,vektor v2) { return (v1.x*v2.x + v1.y*v2.y + v1.z*v2.z);}
    skalar hossz(vektor v1) {return sqrtl(skalar_szorzat(v1,v1));}
    vektor normalt(vektor v1) { return (v1/hossz(v1));}
    vektor vektor_szorzat(vektor va,vektor vb)
    {
    vektor v_;

    v_.x=(va.y*vb.z)-(vb.y*va.z);
    v_.y=(va.z*vb.x)-(vb.z*va.x);
    v_.z=(va.x*vb.y)-(vb.x*va.y);

    return v_;
    };










    skalar g,c,m,rs,dr,rx,ry,dt;
    vektor p,dp,ddp;
    int lepes;


    void newton_gravity()
    {
    skalar r;

    while(p.x<rx)
    {
    p = p + dp*dt ;

    ddp = normalt(p);
    r = hossz(p);

    ddp = normalt(p)*(-g*m/(r*r));
    dp = dp + ddp*dt;
    p = p + ddp*dt*dt/2;
    }
    }
    void refract_gravity()
    {
    skalar r,dpx,dpy,dpx2,dpy2,c1,c2;
    vektor nx,ny;

    while(p.x<rx)
    {
    r = hossz(p);
    c1 = c*(1-g*m/(2*c*c*r)) / pow(1+g*m/(2*c*c*r),3.0);

    p = p + dp*dt ;

    r = hossz(p);
    c2 = c*(1-g*m/(2*c*c*r)) / pow(1+g*m/(2*c*c*r),3.0);//uj fenysebesseg

    ny = normalt(p);//beesesi meroleges
    nx.x = ny.y;
    nx.y = -ny.x;
    nx.z = ny.z;

    dpx = skalar_szorzat(nx,dp);
    dpy = skalar_szorzat(ny,dp);


    dpx2 = dpx *c2*c2/(c1*c1);
    dpy2 = sqrtl(c2*c2 - dpx2*dpx2);
    if(dpy<0) dpy2 = -dpy2;

    dp = (nx*dpx2 + ny*dpy2);
    }
    }



    void alapallapot()
    {
    g = (skalar)6.67428e-11;
    c = (skalar)2.99792458e8;
    m = (skalar)1.9891e30;

    rs = (skalar)2*m*g/(c*c);


    ry = 1392000e3;//sun R
    rx = 150e9;
    lepes = 2000000;
    dt = (rx*2/c)/lepes;


    p = vektor(-rx,ry,(skalar)0.0);
    dp = vektor((skalar)c,(skalar)0.0,(skalar)0.0);
    }

    int main()
    {
    alapallapot();
    newton_gravity();
    skalar fi = -atanl((p.y-ry)/rx)*180/M_PI;
    printf("%Le \n",fi);


    alapallapot();
    refract_gravity();
    skalar fi2 = -atanl((p.y-ry)/rx)*180/M_PI;
    printf("%Le \n",fi2);
    printf("%Le \n",fi2/fi);


    return 0;
    }