Главная | Описание языка | FXD | API | Примеры | Инструменты Разработки | Новости | Ресурсы | Форум
Движение света в гравитационном поле[]
Анализ задачи с позиций классической теории Ньютона[]
Движение света в поле тяготения солнца можно рассматривать с класической точки зрения, учитывая что свет определнной волны состоит из фотонов определенной массы.
Массу фотона можно расчитать по следующим (не классическим ) формулам:
- длина волны, p -импульс фотона, h - постоянная планка E - энергия фотона, - масса покоя фотона m - масса фотона, с - скоросто света
Ссылки:
Нужно рассмотреть фотон соответствующий определенной длине волны ( для примера красный свет ) и посмотреть,
как он отклоняется в поле солнца согласно классическим законам тяготения теории Ньютона. В данном случае полученный результат должен отличаться от экспериментального где-то в 2 раза.
Программа[]
- В программе ниже надо:
- правильно определить ускорение частиц через параметры центральной массивной частицы
- Задать правильные параметры солнца и фотона ( массу, расстояние, ...)
- переставить JavaFX Script плагин в NetBeans (установка плагина)
/*
* 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
}
}
Метрика[]
Математические формулы[]
- Если , то
Метрика на плоскости[]
Нахождение длины окружности.
Зададим уравнение окружности в параметрическом виде:
тогда квадрат маленькой дуги окружности будет равен
Метрика в пространстве[]
Метрика на сфере[]
Сферические полярные координаты:
На сфере , отсюда следует что .
Теперь надо вычислить dx, dy и dz и подставить их в формулу для метрики в 3х-мерном пространстве:
Задачи[]
Дана метрика на сфере:
1. Найти длину мередиана при фиксированном угле
- Кривая где .
2. Найти длину параллели при фиксированном угле
- Кривая где .
3. Найти длину эллипса.
- - уравнение эллипса
- - метрика на плоскости.
4. Дополнительная задача
- Вывести метрику на сфере.
1. Дано:
- - параметризованная кривая .
- - метрика на плоскости.
Длина кривой:
2. Дана метрика на плоскости:
Надо найти уравнение геодезической линии.