Расчет эффекта геопотенциала Земли

Я рассчитываю ускорение из-за гармоник в кадре ECEF. Здесь показан гравитационный потенциал в сферических гармониках (я просто убрал " 1 + ", так как учитывается только эффект гармоник).

U час а р знак равно мю р [ я знак равно 2 д Дж знак равно 0 о ( р е д р ) я п я Дж ( грех ф ) ( С я Дж грех Дж λ + С я Дж потому что Дж λ ) ] ,

куда г и о - степень и порядок, ф и λ - широта и долгота соответственно.

Я сравниваю результаты с GMAT. Для степени 2 и порядка 0 (J2) ошибка распространения составила 5m. Но для степени/порядка=8 ошибка составляет 350 км!

Шаги:

  1. В петле я е [ 2 , 2 ] , Дж е [ 0 , 0 ]

    • Рассчитать п я знак равно г я + Дж г мю я + Дж ( мю 2 1 ) я
    • Вычислить полином Лежандра п я Дж знак равно ( 1 мю 2 ) Дж 2 я ! * 2 я п я
    • Рассчитать с ты м + знак равно п я Дж ( г р ) * ( С потому что ( Дж * а т а н ( у Икс ) ) + С грех ( Дж * а т а н ( у Икс ) ) ) ( р е д р ) я
  2. Рассчитать потенциал U час а р знак равно мю с ты м р
  3. Рассчитать а Икс : ф знак равно г U час а р г Икс
  4. Рассчитать стоимость в точке ф ( р Икс , р у , р г )

Как видно, широта а с я н ( г р ) а долгота а т а н ( у Икс )

Коэффициенты (JGM-3):

2 0 -0.10826360229840e-02 0.0
2 1 -0.24140000522221e-09 0.15430999737844e-08
2 2 0.15745360427672e-05 -0.90386807301869e-06

Я написал код на языке Julia, который строит выражение (в зависимости от степени и порядка).

using SatelliteToolbox
using SymEngine

path="C:/xampp/htdocs/sat_prop/";
JGM_coeff_file=string(path,"coeff.txt");

const date  = DatetoJD(2100,01,01,0,0,0)
const degree = 8

y = [-4617E+03, 1709E+03, -5040E+03]

const Req = 6378136.3
const GMe = 398600.4415E+9

function harmonics(dy,y,dU,date)
  dy= [
        dU[1](y[1],y[2],y[3]),
        dU[2](y[1],y[2],y[3]),
        dU[3](y[1],y[2],y[3])
      ]
end

function potential()

  @vars x y z myu

  CS=open(readdlm,JGM_coeff_file)

  longitude=atan( y/x );
  r=(x^2+y^2+z^2)^(1/2)

  U_sum=0
  for i=2:degree
      for j=0:degree

          index=1+j; for ll=2:i-1 index+=ll+1; end

          P_i=(myu^2-1)^i
          for k=1:i+j P_i=diff(P_i,myu) end

          P_ij=(((1-myu^2)^(j/2))/(factorial(i)*2^i))*P_i

          if(P_ij!=0)
            U_sum+= P_ij(z/r)*(CS[index,3]*cos(j*longitude)+CS[index,4]*sin(j*longitude))*(Req/r)^i
          end
       end
  end

  U=GMe*(U_sum)/r

  return lambdify(expand(diff(U,x)),[x,y,z]),lambdify(expand(diff(U,y)),[x,y,z]),lambdify(expand(diff(U,z)),[x,y,z])
end


dU=potential();
dy=zero(y)
@time harmonics(dy,y,dU,date)
@time harmonics(dy,y,dU,date)
В какой системе координат находятся координаты X, Y и Z? Они должны быть в ECEF.
+1Отличный монтаж, так намного лучше выглядит, очень красиво! Сегодня я постараюсь внимательно посмотреть, спасибо, что нашли время покопаться в MathJax!
@Leeloo, хорошо, спасибо за правки. Честно говоря, я не знаю, к сожалению, как ответить на этот вопрос, поскольку я использовал только уравнения Пайнса для вычисления гармоник.
@Leeloo, уравнения занимают несколько страниц. Хорошей ссылкой является Глава 2 докторской диссертации Брэндона А. Джонса, 2010 г. Она доступна бесплатно на веб-сайте Университета Колорадо. Думаю, имя файла должно называться «bajones2010». Он также упоминает две другие формулировки, которые должны ускорить вычисления (Fantino 2008), но мне они показались значительно более сложными. Я внедрил Pines здесь , на Rust, как часть набора инструментов, который я пишу, чтобы автоматизировать большую часть анализа, который я делаю, и с точностью GMAT.
@Leeloo Я посмотрю, это выглядит очень многообещающе! Возможно, полезно и здесь: как я могу проверить реконструированное гравитационное поле Цереры по сферическим гармоникам?
Я не знаком с языком Джулии, но мне кажется, что когда вы дифференцируете U от Икс , вы предполагаете, что мю и λ оставаться постоянным, как Икс меняется, что неправильно. Вы говорите, что уже пытались заменить широту на как в ( г р ) , долгота с загар ( у Икс ) ; не могли бы вы показать программу с этими изменениями?
@Лито Обновлено.
Не myuследует рассчитывать, как z/rв potentialфункции?
@Litho Нет, есть производная от myu. Но затем он заменил как z/r. Я полагаю, проблема в том, что долгота должна бытьatan2(y,x)
Ну, как я уже сказал, я не знаком с Джулией, но мне кажется, что этот подход подразумевает, что myuне зависит от x, yи z. Но это так, поэтому производные неверны.
@Litho Дело не в языке: в полиноме Лежандра вы вычисляете производную по myu. Но затем, когда вы вычисляете производную от U, myuзаменяется наz/r
О, теперь я вижу. Вы используете P_ij(z/r)при расчете U_sum. Я не замечал этого раньше.
Можете ли вы показать нам первые несколько строк вашего файла коэффициентов?
@cms Добавлено к вопросу.

Ответы (1)

Будьте осторожны с арктангенсом

Я не знаком с Джулией, но на большинстве языков арктический ( у / Икс ) возвращает значение между [ π / 2 , π / 2 ] . Он делает это, потому что не знает, у или Икс является положительным или отрицательным. Итак, когда вы вычисляете долготу как:

λ знак равно арктический ( у Икс ) знак равно арктический ( 4617 × 10 3 1709 × 10 3 ) знак равно 69,7

То есть в четвертом квадранте, т. 180 от того места, где на самом деле находится долгота (2-й квадрант, когда у положительный и Икс является отрицательным). Это не имеет значения для Дж знак равно 0 такие как J2, но он инвертирует тессеральные члены, так как грех ( θ + 180 ) знак равно грех θ и потому что ( θ + 180 ) знак равно потому что ( θ ) . Это могло бы объяснить несоответствие в соглашении при добавлении дополнительных терминов.

Используйте арктан2

В большинстве языков есть специальная функция (обычно называемая "atan2(x,y)" или ее вариант), которая принимает два параметра: параметр x и y. Если у вас его нет, вам придется использовать некоторые операторы if, чтобы определить, в каком квадранте на самом деле находится долгота.

Ты абсолютно прав. Однако с atan2 в Джулии какие-то проблемы, поэтому я использовал longitude=atan(y/x)+pi*sign(y)*(1-sign(x))/2. Это нормально? Предполагается, что x и y никогда не равны 0.