Каковы некоторые алгоритмы, которые позволят мне моделировать планетарную физику?

function doSth(){
  var a = document.getElementById('input').value;
  document.getElementById('number').innerHTML = toNumber(a) + 1;
}
function toNumber(str){
  return +str;
}
<input id="input" type="text">
<input onclick="doSth()" type="submit">
<span id="number"></span>

28
задан Gaius 2 February 2010 в 08:53
поделиться

9 ответов

Это отличный учебник по проблемам N-тела в целом.

http://www.artcompsci.org/#msa

Он написан с использованием Ruby, но довольно прост в отображении на другие языки и т. Д. Он охватывает некоторые из общих подходов интеграции; Форвард-Эйлер, чехарда и эрмит.

6
ответ дан Ade Miller 20 November 2019 в 03:51
поделиться

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

Есть множество таких симуляторов онлайн.

Вот один простой пример, реализованный в 500 строках кода. (Монитор algorhitm намного меньше) http://astro.berkeley.edu/~dperley/programs/ssms.html .

Также проверьте это:
http://en.wikipedia.org/wiki/Kepler_problem
http://en.wikipedia.org / wiki / Two-body_problem
http://en.wikipedia.org/wiki/N-body_problem

2
ответ дан Luka Rahne 20 November 2019 в 03:51
поделиться

Ознакомьтесь с nMod , инструментарием моделирования n-body, написанным на C ++ и использующим OpenGL. Он имеет довольно густонаселенную модель солнечной системы, которая поставляется с ним, и ее должно быть легко изменить. Кроме того, у него есть довольно хорошая вики о симуляции n-тела в целом. Тот же самый парень, который создал это, также делает новую программу под названием Moody , но, похоже, это не так уж далеко.

Кроме того, если вы собираетесь проводить симуляции n-тел с несколькими объектами, вам стоит обратить внимание на метод быстрого мультиполя (также называемый алгоритмом быстрого мультиполя). Это может уменьшить количество вычислений от O (N ^ 2) до O (N), чтобы действительно ускорить ваше моделирование. Это также один из десяти самых успешных алгоритмов 20-го века , согласно автору этой статьи.

1
ответ дан Justin Peel 20 November 2019 в 03:51
поделиться

Похоже, что это очень сложно и требует глубоких знаний физики, но на самом деле это очень просто, вам нужно знать только 2 формулы и базовое понимание векторов:

Сила притяжения (или гравитационная сила) между планетой 1 и планетой 2 с массой m1 и m2 и расстоянием между ними d: Fg = G * m1 * m2 / d ^ 2; Fg = m * a. G - это константа, найдите ее, подставив случайные значения, чтобы ускорение «а» не было слишком маленьким и не слишком большим, приблизительно «0,01» или «0,1».

Если у вас есть общая векторная сила, которая действует на текущую планету в этот момент времени, вы можете найти мгновенное ускорение a = (общая сила) / (масса текущей планеты). А если у вас есть текущее ускорение, текущая скорость и текущая позиция, вы можете найти новую скорость и новую позицию

Если вы хотите выглядеть реально, вы можете использовать следующий сверхлегкий алгоритм (псевдокод):

int n; // # of planets
Vector2D planetPosition[n]; 
Vector2D planetVelocity[n]; // initially set by (0, 0)
double planetMass[n];

while (true){
    for (int i = 0; i < n; i++){
        Vector2D totalForce = (0, 0); // acting on planet i
        for (int j = 0; j < n; j++){
            if (j == i)
                continue; // force between some planet and itself is 0
            Fg = G * planetMass[i] * planetMass[j] / distance(i, j) ^ 2;
        // Fg is a scalar value representing magnitude of force acting
        // between planet[i] and planet[j]
        // vectorFg is a vector form of force Fg
        // (planetPosition[j] - planetPosition[i]) is a vector value
        // (planetPosition[j]-planetPosition[i])/(planetPosition[j]-plantetPosition[i]).magnitude() is a
        // unit vector with direction from planet[i] to planet[j]
            vectorFg = Fg * (planetPosition[j] - planetPosition[i]) / 
                  (planetPosition[j] - planetPosition[i]).magnitude();
            totalForce += vectorFg;
        }
        Vector2D acceleration = totalForce / planetMass[i];
        planetVelocity[i] += acceleration;
    }

    // it is important to separate two for's, if you want to know why ask in the comments
    for (int i = 0; i < n; i++)
        planetPosition[i] += planetVelocity[i];

    sleep 17 ms;
    draw planets;
}
1
ответ дан rint 20 November 2019 в 03:51
поделиться

Это все здесь И вообще все, что написал Джин Миус.

alt text

9
ответ дан 28 November 2019 в 03:45
поделиться

Вот вам:

How to: Reference ASP.NET Master Page Content

Из статьи, похоже, что

If Master.SQLerror = Nothing Then
    InternalSQLErrLabel.Text = ("No Errors Reported")
End If

должен работать на вас.

Просто добавьте директиву MasterType, как описано выше, или вы можете получить ошибку преобразования типа. (Или вы могли бы использовать переменную вашего типа мастер-страницы вместо Master, как предлагает daRoBBie в своем ответе.)

Я создал тестовый веб-сайт только для того, чтобы проверить это, и это работает. Вот полный источник сайта :

Site1.Master :

<%@ Master Language="VB" AutoEventWireup="false" CodeBehind="Site1.master.vb" Inherits="WebApplication1.Site1" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        This is the Master Page content.
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
        </asp:ContentPlaceHolder>
    </div>
    </form>
</body>
</html>

Site1.Master.vb :

Public Partial Class Site1
    Inherits System.Web.UI.MasterPage

    Private _SQLerror As String

    Public Property SQLerror() As String
        Get
            Return _SQLerror
        End Get
        Set(ByVal value As String)
            _SQLerror = String.Empty
        End Set
    End Property
End Class

WebForm1.aspx :

<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/Site1.Master"
    CodeBehind="WebForm1.aspx.vb" Inherits="WebApplication1.WebForm1" %>

<%@ MasterType VirtualPath="~/Site1.Master" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    This is the Content Page content.
    <asp:Label ID="InternalSQLErrLabel" runat="server" Text="Label"></asp:Label>
</asp:Content>

WebForm1.aspx.vb :

Public Partial Class WebForm1
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Master.SQLerror = Nothing Then
            InternalSQLErrLabel.Text = ("No Errors Reported")
        End If
    End Sub

End Class

-121--643148-

используйте оператор кавычек Oracle:

select q'#someone's quote#' from dual;

символ «#» может быть заменен любым символом

-121--4907830-

Вам нужно знать и понимать Закон всеобщего тяготения Ньютона и Законы планетарного движения Кеплера . Эти двое просты, и я уверен, что вы слышали о них, если не изучали их в средней школе. Наконец, если вы хотите, чтобы ваш симулятор был максимально точным, вам следует ознакомиться с проблемой n-Body .

Начните просто. Попробуйте создать объект Sun и объект Earth , который вращается вокруг него. Это должно дать вам очень солидное начало, и его довольно легко расширить оттуда. Объект планеты будет выглядеть примерно так:

Class Planet {
  float x;
  float y;
  float z; // If you want to work in 3D
  double velocity;
  int mass;
}

Просто помните, что F = MA , а остальные просто скучная математика: P

8
ответ дан 28 November 2019 в 03:45
поделиться

Вы можете взглянуть на Celestia , бесплатный космический симулятор. Я верю, что вы можете использовать его для создания фиктивных солнечных систем, и это открытый источник .

4
ответ дан 28 November 2019 в 03:45
поделиться

Если вы моделируете физику, я настоятельно рекомендую Box2D .
Это отличный симулятор физики, который действительно сократит количество необходимого вам котла за счет моделирования физики.

0
ответ дан 28 November 2019 в 03:45
поделиться

Fundamentals of Astrodynamics by Bate, Muller, and White все еще является обязательным чтением в моей альма-матер для инженеров аэрокосмической отрасли. Это, как правило, охватывает орбитальную механику тел на околоземной орбите ... но это, вероятно, уровень физики и математики, который вам понадобится, чтобы начать свое понимание.

+1 за предложение @Stefano Borini "все, что написал Жан Миус"

.
0
ответ дан 28 November 2019 в 03:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: