JavaFX
Advertisement

Главная | Описание языка | FXD | API | Примеры | Инструменты Разработки | Новости | Ресурсы | Форум

Движение света в гравитационном поле[]

Анализ задачи с позиций классической теории Ньютона[]

Движение света в поле тяготения солнца можно рассматривать с класической точки зрения, учитывая что свет определнной волны состоит из фотонов определенной массы.


Массу фотона можно расчитать по следующим (не классическим ) формулам:

              - длина волны, p -импульс фотона, h - постоянная планка
   E - энергия фотона,  - масса покоя фотона  
          m - масса фотона, с - скоросто света

Ссылки:


Нужно рассмотреть фотон соответствующий определенной длине волны ( для примера красный свет ) и посмотреть, как он отклоняется в поле солнца согласно классическим законам тяготения теории Ньютона. В данном случае полученный результат должен отличаться от экспериментального где-то в 2 раза.

Программа[]

  • В программе ниже надо:
    • правильно определить ускорение частиц через параметры центральной массивной частицы
    • Задать правильные параметры солнца и фотона ( массу, расстояние, ...)
    • переставить JavaFX Script плагин в NetBeans (установка плагина)

Photon trajectory


/*
 * Main.fx
 *
 * Created on 00:00:00.
 */

package javafxapplication3;

/**
 * @author User
 */

 // place your code here

import javafx.animation.*;                         //подключаем библиотеки
import javafx.stage.*;

import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.transform.*;


import java.lang.System;
import java.lang.Math;

function sqrt(x:Number):Number{
    Math.sqrt(x)
}

function cosin(x:Number,y:Number,z:Number):Number{
if (z>0) then return -x/Math.sqrt(x*x+y*y)
else return -y/Math.sqrt(x*x+y*y);
}

function R(x:Number,y:Number):Number{
    return Math.sqrt(x*x+y*y)
}
var G=6.67*Math.exp(-11);
var deltaAngle:Number;
var k=10727.03778;

function Ugol(x:Number,y:Number):Number{
return Math.atan(y/x)
}


class Particle{                              //задем класс частиц
    public var name: String ;
    public var color: Color;

    public var x: Number ;
    public var y: Number ;
    public var velocityX: Number ;
    public var velocityY: Number ;

    public var radius: Number ;
    public var mass: Number;

    public override function clone():Particle {
        Particle{
            name: name,
            color: color,
            x: x
            y: y
            velocityX: velocityX
            velocityY: velocityY,
            radius: radius
            mass: mass
            }
    }
}

class ParticleSystem extends CustomNode{
    public var centralParticle: Particle;
    public var particles: Particle[];

    public var dt: Number = 0.01 ;
             public var time: Number = 0;

    public function run () {


        for (particle in particles){

            //  Solar mass: centralParticle.mass
            var ax = cosin(particle.x*Math.exp(7),particle.y*Math.exp(7),1) * ( G* centralParticle.mass) / (R(particle.x*Math.exp(7),particle.y*Math.exp(7))*R(particle.x*Math.exp(7),particle.y*Math.exp(7))*k);  //задаем ускорение по х
            var ay = cosin(particle.x*Math.exp(7),particle.y*Math.exp(7),-1) * (G* centralParticle.mass) / (R(particle.x*Math.exp(7),particle.y*Math.exp(7))*R(particle.x*Math.exp(7),particle.y*Math.exp(7))*k) ;   //задаем ускорение по у

           // System.out.println(ay);
            particle.velocityX = ax * dt +  particle.velocityX;     //скорость х
            particle.velocityY = ay * dt +  particle.velocityY;     //скорость у

            particle.x =  particle.velocityX * dt +  particle.x;    //смещение х
            particle.y =  particle.velocityY * dt +  particle.y;    //смещение у
       //  println('particle.x');println(particle.x);
        //println('particle.y');println(particle.y);
        //   println(Ugol(particle.x+200,particle.y+75));
deltaAngle=Ugol(particle.x+200,particle.y+75);
        }
                time += dt;

    }

        public override function create():Node{
        return Group{
            content: [
                Circle{
                    radius: bind centralParticle.radius
                    fill: centralParticle.color
                },
                for (particle in particles)
                Circle{
                    radius: particle.radius
                    fill: particle.color
                    centerX: bind particle.x
                    centerY: bind particle.y
                }
//Line{
  //        startX: bind -375
    //    startY: bind -70
      //endX: bind 1000
    //endY: bind -70
//
  //        stroke: Color.DARKGRAY
    //    strokeWidth: 1
//}
            ]
        }
    }
    public override function clone():ParticleSystem {
        ParticleSystem{
            centralParticle: centralParticle
            particles:
            for( particle in particles)
            particle.clone()
            }

    }
}

class CustomButton extends CustomNode {

    public var text: String;
    public var action: function();

    public override function create(): Node {
        return Group {
            content: [
                Rectangle{
                    width: 100
                    height: 50
                    arcHeight: 10
                    arcWidth: 10
                    fill: Color.LIGHTBLUE
                    onMouseClicked: function(e){
                        action();
                    }

                }
                Text{
                    x: 30
                    y: 30
                    font: Font{
                        size: 16
                    }
                    content: "Reset"
                }
            ]
        };
    }
}


var particleSystem = ParticleSystem{
    centralParticle: Particle{              //создаем частицу "Zvezda"
        name: "Zvezda"
        radius: 70
        mass: 1.9 * Math.exp(30)// Define Sun mass
        color: Color.ORANGE
    }

    particles: [
         Particle{                           //Создаем частицу 'земля'
            name: "Earth"
            radius: 3
            color: Color.GREEN
            mass: 5.97*Math.exp(24) // Define Earth mass
            x: 1124  // Define Earth distance to Sun
            y: -73
            velocityX: -2.9*Math.exp(-5)
            velocityY: -2.9*Math.exp(-5)

        },
        Particle{                           //Создаем частицу "красный луч"
            name: "Red Light"
            radius: 1
            color: Color.RED
            mass: 3.6*Math.exp(-47) // Define Red Photon mass
            x: -200
            y: -75
            velocityX: 30
            velocityY: 0

        },


    ]


};


var currentParticleSystem = particleSystem.clone();

var timeline = Timeline {
    keyFrames: KeyFrame {
        time: 0.003s,
        action: function() {
            if(currentParticleSystem.time < 44.12){
                currentParticleSystem.run()
            }
        }
    }
    repeatCount: Timeline.INDEFINITE
}

timeline.play();


    Stage{                                      //Создаем окно программы
    title: "Light in the Gravity Field"
    width: 1270
    height: 700
    onClose: function(){
        System.exit(0);
    }
    scene: Scene{
        content: [
            Text{
            x:50
            y:100
             fill: Color.WHITE
                font: Font{ size: 16}
                content: bind "Delta Angle: {deltaAngle}"

        }

            CustomButton {
                transforms: Transform.translate(20, 20)  // sdvig componenty
                text: "Reset"
                action: function(){
                    currentParticleSystem = particleSystem.clone();
                }

            },
            Group{
                content: Group{
                    transforms: Transform.translate(100, 350)  //zadaem koordinatbI i stavim v nih tochku (0,0)
                    content: bind currentParticleSystem
                }
            }
        ]
        fill: Color.BLACK

    }

}


Анализ задачи с позиций Общей Теории Относительности[]

  • Выбрать способ движение волн/частиц в искривленном пространстве-времени
    • Движение по геодезическим линиям

Принцип наименьшего действия

Это известная о том, как находить эктремум некоторой велечины s, которая зависит от функции если функция закреплена на концах. Если есть возможность представить s как тогда L называют Лагранжианом. Известен способ получения уравнений Лагранжа, решая которые, можно найти ту самую функцию, на которой S экстремально.

Уравнения Лангранжа:a Невозможно разобрать выражение (синтаксическая ошибка): {\displaystyle \frac{\delta L}{\delta q_{i}}-\frac{d(\frac{\partial L} {\partial q'_{i}})} {d t} =0 , где q_i-i} -тая функция координат.

В физике Ньютона S называется действием, L = K-V (кинетическая минус потенциальная энергия), а уравнения Лагранжа совпадают со 2м законом Ньютона. Все это интерпретируются так, что частица движется по траектории, на которой действие минимально.

В нашем случае частицы движутся по геодезическим линиям (линиям, длина которых минимальна иди максимальна). У нас есть Метрика Шварцшильда: Невозможно разобрать выражение (синтаксическая ошибка): {\displaystyle (ds)^2=c^2*(1- \frac{R_{g}}{r})*(dt)^2 - r^2*sin^2(\theta)*d(\phi)^2 - r^2*(d\theta)^2 - \frac{(dr)^2}{1-\frac{R_{g}}{r}}, где Rg=\frac{2MG}{c^2} }

Мы будем рассматривать движение только в плоскости содержащей центр небесного тела, т.к. отклонение происходит к нему, тогда . Мы знаем как вычислять длину траектории:

Тогда напишем уравнения Лагранжа: Для :

Откуда:

, где а-некоторая константа.


Для :


Обозначим числитель первого слагаемого за Т. Распишем :

Обозначим второе слагаемое за В.

Подставим:


Выразим :

А теперь выразим :


Эта формула нам подходит, так как мы уже знаем, как выражать через .

Вот код программы:


/*
 * Main.fx
 *
 * Created on 00:00:00.
 */

package javafxapplication1;

/**
 * @author User
 */

 // place your code here

import javafx.animation.*;                         //
import javafx.stage.*;

import javafx.scene.*;
import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.shape.*;
import javafx.scene.transform.*;


import java.lang.System;
import java.lang.Math;

var G=6.67e-11;
var deltaAngle:Number;
var c=2.9e8;
var a=1;

function sqrt(x:Number):Number{
    Math.sqrt(x)
}

function cosin(x:Number,y:Number,z:Number):Number{
if (z>0) then return -x/Math.sqrt(x*x+y*y)
else return -y/Math.sqrt(x*x+y*y);//Math.atan(y/x)//
}

function s(x:Number,y:Number):Number{
   if (y>=1) then return s(x,y-1)*x
   else return 1
}

function xr(x:Number,y:Number,z:Number):Number{
if (z>0) then return Math.sqrt(s(x,2)+s(y,2))
else return Math.acos(x/Math.sqrt(s(x,2)+s(y,2)))
}
function rx(r:Number,p:Number,z:Number):Number{
if (z>0) then return r*Math.cos(p)
else return    r*Math.sin(p)
}
function vxvr(x:Number,vx:Number,y:Number,vy:Number,z:Number):Number{
if (z>0) then return (x*vx-y*vy)/(Math.sqrt(s(x,2)+s(y,2)))
else return (vy*x-vx*y)/(x*x+y*y)
}
function vrvx(r:Number,vr:Number,p:Number,vp:Number,z:Number):Number{
if (z>0) then return vr*Math.sin(p)-r*Math.cos(p)*vp
else return vr*Math.cos(p)-r*Math.sin(p)*vp
}


function L1(r:Number,R:Number,vX:Number,vY:Number):Number{
return Math.sqrt(s(c,2)*(1-R/r)-s(r,2)*s(vY,2)-s(vX,2)*r/(r-R))
}

function L2(r:Number,R:Number,vX:Number):Number{
return Math.sqrt((s(c,2)*(s(r,2)-R*r)-s(vX,2)*s(r,3)/(r-R))/(s(r,2)+s(a,2)))
}

function B(r:Number,R:Number,vX:Number):Number{
return ((2*r*vX*s(c,2)-s(c,2)*R*vX)*(s(r,2)+s(a,2))*s((r-R),2)-L2(r,R,vX)*s(r,3)*vX*s((r-R),2)-s(vX,3)*s(r,3)*(s(r,2)+s(a,2)))/(s((s(r,2)+s(a,2)),2)*L2(r,R,vX)*s((r-R),2))
}

function T(r:Number,R:Number,vX:Number):Number{
return ((2*s(c,2)*r-s(c,2)*R-(2*s(vX,2)*s(r,3)-3*s(vX,2)*s(r,2)*R)/(s(r-R,2)))*(s(r,2)+s(a,2))-2*r*(s(c,2)*s(r,2)-s(c,2)*R*r-(s(vX,2)*s(r,3))/(r-R)))/(2*s(s(r,2)+s(a,2),2)*L2(r,R,vX))
}

//function Ugol(x:Number,y:Number):Number{
//return Math.atan(y/x)
//}


class Particle{                              //
    public var name: String ;
    public var color: Color;

    public var x: Number ;
    public var y: Number ;
    public var vX: Number ;
    public var vY: Number ;

    public var radius: Number ;
    public var mass: Number;

    public override function clone():Particle {
        Particle{
            name: name,
            color: color,
            x: x
            y: y
            vX: vX
            vY: vY,
            radius: radius
            mass: mass
            }
    }
}

class ParticleSystem extends CustomNode{
    public var centralParticle: Particle;
    public var particles: Particle[];

    public var dt: Number = 0.01 ;
             public var time: Number = 0;

    public var R:Number=2*G*centralParticle.mass/(c*c) ;
    public function run () {


        for (particle in particles){
            var r=xr(particle.x*s(10,8),particle.y*s(10,8),1);
            var p=xr(particle.x*s(10,8),particle.y*s(10,8),0);
            var vr=vxvr(particle.x*s(10,8),particle.vX*s(10,8),particle.y*s(10,8),particle.vY*s(10,8),1);
            var vp=vxvr(particle.x*s(10,8),particle.vX*s(10,8),particle.y*s(10,8),particle.vY*s(10,8),1);

            //  Solar mass: centralParticle.mass
           var ar = (2*vr*(s(r,2)+s(a,2))*(r-R)*B(r,R,vr)*L2(r,R,vr)-2*s(r,2)*s(vr,2)*(2*s(a,2)*r-s(r,2)*R-s(a,2)*R)*s(L2(r,R,vr),2)-(r-R)*s(L2(r,R,vr),2)*T(r,R,vr))/((s(r,6)-s(r,5)*R+s(r,4)*s(a,2)-s(r,3)*s(a,2)*R)*s(L2(r,R,vr),2)-s(vr,2)*s(r,6)) ;  // r
            //var ap =(vp*r*((s(c,2)*R*vr/s(r,2))-2*vr*r*s(vp,2)-(2*ar*vr*r-2*R*ar*vr*r-s(vr,2)*R)/(s(r-R,2)))-4*vr*vp*L1(r,R,vr,vp))/(2*r*L1(r,R,vr,vp)+2*s(vp,2)*s(r,2));   // ph

           // System.out.println(ay);
           vr = ar * dt +  vr;     // r
           vp = -a*L1(r,R,vr,vp)/s(r,2);     // phi

            r =  vr * dt +  r;    //r
            p =  vp * dt +  p;    //phi
            //println('particle.x');println(particle.x);
            //println(Ugol(particle.x+200,particle.y+75));
//deltaAngle=Ugol(r+200,p+75);
            particle.x=rx(r,p,1)/s(10,8);
            particle.y=rx(r,p,0)/s(10,8);
            particle.vX=vrvx(r,vr,p,vp,1)/s(10,8);
            particle.vY=vrvx(r,vr,p,vp,0)/s(10,8);
        }
                time += dt;

    }

        public override function create():Node{
        return Group{
            content: [
                Circle{
                    radius: bind centralParticle.radius
                    fill: centralParticle.color
                },
                for (particle in particles)
                Circle{
                    radius: particle.radius
                    fill: particle.color
                    centerX: bind particle.x
                    centerY: bind particle.y
                }
//Line{
  //        startX: bind -375
    //    startY: bind -70
      //endX: bind 1000
    //endY: bind -70
//
  //        stroke: Color.DARKGRAY
    //    strokeWidth: 1
//}
            ]
        }
    }
    public override function clone():ParticleSystem {
        ParticleSystem{
            centralParticle: centralParticle
            particles:
            for( particle in particles)
            particle.clone()
            }

    }
}

class CustomButton extends CustomNode {

    public var text: String;
    public var action: function();

    public override function create(): Node {
        return Group {
            content: [
                Rectangle{
                    width: 100
                    height: 50
                    arcHeight: 10
                    arcWidth: 10
                    fill: Color.LIGHTBLUE
                    onMouseClicked: function(e){
                        action();
                    }

                }
                Text{
                    x: 30
                    y: 30
                    font: Font{
                        size: 16
                    }
                    content: "Reset"
                }
            ]
        };
    }
}


var particleSystem = ParticleSystem{
    centralParticle: Particle{              // "Zvezda"
        name: "Zvezda"
        radius: 70
        mass: 1.9e30// Define Sun mass
        color: Color.ORANGE
    }

    particles: [
         Particle{                           //
            name: "Earth"
            radius: 7
            color: Color.GREEN
            mass: 5.97e24 // Define Earth mass
            x: 124  // Define Earth distance to Sun
            y: 1
            vX: 0
            vY: 2.041286383e-7

        },
        Particle{                           //
            name: "Red Light"
            radius:  3
            color: Color.RED
            mass: 3.6e-47 // Define Red Photon mass
            x: -200
            y: -75
            vX: 2.9
            vY: 0

        },


    ]


};


var currentParticleSystem = particleSystem.clone();

var timeline = Timeline {
    keyFrames: KeyFrame {
        time: 0.0003s,
        action: function() {
            if(currentParticleSystem.time < 43.2){
                currentParticleSystem.run()
            }
        }
    }
    repeatCount: Timeline.INDEFINITE
}

timeline.play();


    Stage{                                      //
    title: "Light in the Gravity Field"
    width: 1270
    height: 700
    onClose: function(){
        System.exit(0);
    }
    scene: Scene{
        content: [
            Text{
            x:50
            y:100
             fill: Color.WHITE
                font: Font{ size: 16}
                content: bind "Delta Angle: {deltaAngle}"

        }

            CustomButton {
                transforms: Transform.translate(20, 20)  // sdvig componenty
                text: "Reset"
                action: function(){
                    currentParticleSystem = particleSystem.clone();
                }

            },
            Group{
                content: Group{
                    transforms: Transform.translate(375, 350)  //zadaem koordinatbI i stavim v nih tochku (0,0)
                    content: bind currentParticleSystem
                }
            }
        ]
        fill: Color.BLACK

    }

}

Метрика[]

Математические формулы[]


Если , то

Метрика на плоскости[]

Function



Нахождение длины окружности.

Зададим уравнение окружности в параметрическом виде:

тогда квадрат маленькой дуги окружности будет равен


Метрика в пространстве[]

Метрика на сфере[]

Сферические полярные координаты:


На сфере , отсюда следует что .

Теперь надо вычислить dx, dy и dz и подставить их в формулу для метрики в 3х-мерном пространстве:

Задачи[]

Дана метрика на сфере:

1. Найти длину мередиана при фиксированном угле

Кривая где .

2. Найти длину параллели при фиксированном угле

Кривая где .


3. Найти длину эллипса.

- уравнение эллипса
- метрика на плоскости.

4. Дополнительная задача

Вывести метрику на сфере.


1. Дано:

- параметризованная кривая .
- метрика на плоскости.


Длина кривой:


2. Дана метрика на плоскости:

Надо найти уравнение геодезической линии.

Ссылки[]

Опыты подтверждающие общую теорию относительности
Теги для математических формул
Advertisement