[MATLAB] Modeling gravity using polar coordinates Argh

Click For Summary

Discussion Overview

The discussion revolves around modeling gravity in a MATLAB simulation of a rocket's mechanics using polar coordinates. Participants explore the implications of gravitational forces on orbital dynamics, particularly focusing on the relationship between gravitational acceleration and orbital velocity.

Discussion Character

  • Exploratory
  • Technical explanation
  • Conceptual clarification

Main Points Raised

  • One participant describes their simulation setup using MATLAB's ode45 to model a rocket's motion under gravity, drag, and thrust, noting a conceptual issue with gravity's effect on orbital velocity.
  • The participant expresses confusion about why gravitational acceleration, which they define as affecting height negatively, does not seem to allow for a stable orbit, leading to a decrease in height over time.
  • Another participant suggests that sharing the entire MATLAB script could help others diagnose the issue, indicating that some may have the capability to run the code and observe the results.
  • A later reply questions the participant's understanding of how gravitational acceleration interacts with orbital velocity, specifically why orbiting objects increase speed as they approach a gravitational body.

Areas of Agreement / Disagreement

Participants do not appear to reach a consensus on the underlying conceptual issues related to gravity and orbital mechanics. There are multiple viewpoints regarding the nature of the problem, with some focusing on the MATLAB implementation and others on the theoretical aspects of orbits.

Contextual Notes

The discussion highlights potential limitations in the participant's understanding of gravitational effects in orbital mechanics, particularly the role of gravitational acceleration in relation to orbital velocity. There is also an indication that the participant's code may not be the source of the conceptual confusion.

ellipsis
Messages
158
Reaction score
24
I've been using MATLAB (ode45) to simulate the mechanics of a rocket under the forces of gravity, drag, and internal thrust.y I've recently refactored my simulation to include 2d space, orientation of the rocket, etc. (So I can try to make it orbit, finding optimal ascent profiles, etc)

Because I want to retain the simplicity of my 1d model, I've attempted to use polar coordinates for defining the rockets position, velocity, and acceleration. I've implemented it, but when I run the simulation and plot height vs theta... I get a disturbing picture.

Gravity does not affect the orbital velocity in any way. It always accelerates the height of the rocket downward. And yet for it to orbit, it needs to have a cyclic, non-zero height. Something is very wrong here, and I can't tell what it is.

The line defining gravitational acceleration is as follows. I define it as a vector, with the first component being orbital acceleration (how much theta's rate of change changes due to gravity), and the second component being height's acceleration. (height is y, here)
Code:
grav = [0; -S/(R+y)^2];

Since S (the standard gravitation parameter) is positive, the acceleration of height will always be negative. The height of the rocket must inevitably go to zero. My intuition of gravity no longer makes sense.

This is bothering me on a visceral level. I can't tell what I'm doing wrong. I now suspect the Earth will fall into Sol in the next few hours.
 
Physics news on Phys.org
It would help if you posted the whole MATLAB script as some folks have MATLAB and could run it to see what's happening.
 
All right, I will post the whole thing. It's large though. There's four files, p_step.m, simul.m, eventy.m, and designer.m

p_step.m is the function ode45 calls, and is basically a system of nonlinear differential equations.
simul.m is the main script which calls ode45 and plots the data.
eventy.m defines events (out_of_fuel, and ground_collision)
designer.m specifies rocket properties (thrust, efficiency, etc)

p_step.m:
Code:
function dx = p_step(~, Z)

  global T II IF;
  global TH;
  

  S = 3.5316E12;
  R = 6E5;
  D = 9.784758844E-4;
  H = 5E3;
  G = 9.82;
  
  x = Z(1);
  y = Z(2);
  TH = y*3.14/200000;
  
  vx = Z(3);
  vy = Z(4);
  th = Z(5);
  m = Z(6);
  
  atm = exp(-y/H);
  
  grav = [0; -S/(R+y)^2];
  drag = -D*atm*[vx; vy].^2;
  thrust = T/m*[sin(TH); cos(TH)];
  
  a = thrust + drag + grav;
  ax = a(1);
  ay = a(2);
  
  dm = T/(((IF-II)*atm-IF)*G);
  dth = 0;
  
  dx = [vx; vy; ax; ay; dth; dm];
  
end

simul.m:
Code:
  global T II IF ME MF;

  type = 8;

  T = engine_thrusts(type);
  II = engine_atm_isps(type);
  IF = engine_vac_isps(type);
  ME = engine_masses(type);
  
  G = 9.82;
  R = 1.5;
  
  MI = T/(G*R);
  MF = (MI+7*ME)/8;
  
  
  opt = odeset('Events',@eventy);
  
  [t,y,~,ey,ei] = ode45(@p_step,[0 1000],[0, 0, 0, 0, 0, MI], opt); 
  plot(y(:,1), y(:,2));
  
  if (numel(ei)~=0)
  switch ei(1)
  case 1
  max_dv = ey(3);
  case 2
  max_dv = -1;
  end
  else
  fprintf('Flight timed out\n');
  max_dv = 0;
  end
  
  fprintf('max-velocity:\t%.2f\n',max_dv);

eventy.m:
Code:
function [zero, terminal, negative] = eventy(~,x)

  global MF;
  
  zero = [x(6) - MF; sign(x(2))+1];
  terminal = [1; 1];
  negative = [0; 0];
  
end

designer.m:
Code:
global engine_names engine_thrusts engine_masses engine_atm_isps engine_vac_isps;

engine_names = ['LV-1 Liquid Fuel Engine'... % 1
  'Rockomax 48-7S'... % 2
  'LV-909 Liquid Fuel Engine'... % 3
  'LV-N Atomic Rocket Motor'... % 4
  'R.A.P.I.E.R. Engine'... % 5
  'Toroidal Aerospike Rocket'... % 6
  'LV-T45 Liquid Fuel Engine'... % 7
  'LV-T30 Liquid Fuel Engine'... % 8
  'Rockomax "Poodle" Liquid Engine'... % 9
  'Rockomax "Skipper" Liquid Engine'... % 10
  'Rockomax "Mainsail" Liquid Engine'... % 11
  'Kerbodyne KR-2L Advanced Engine'... % 12
  'S3 KS-25x4 Engine Cluster']; % 13

engine_thrusts = [4 30 50 60 175 175 200 215 220 650 1500 2500 3200];

engine_masses = [.03 .1 .5 2.25 1.2 1.5 1.5 1.25 2 3 6 6.5 9.75];

engine_atm_isps = [220 300 300 220 320 388 320 320 270 320 320 280 320];

engine_vac_isps = [290 350 390 800 360 390 370 370 390 370 360 380 360];

fuel_names = ['Kerbodyne S3-14400 Tank'...
  'Kerbodyne S3-7200 Tank'...
  'Rockomax Jumbo-64 Fuel Tank'...
  'Kerbodyne S3-3600 Tank'...
  'Rockomax X200-32 Fuel Tank'...
  'Rockomax X200-16 Fuel Tank'...
  'FL-T800 Fuel Tank'...
  'Rockomax X200-8 Fuel Tank'...
  'FL-T400 Fuel Tank'...
  'FL-T200 Fuel Tank'...
  'FL-T100 Fuel Tank'...
  'ROUND-8 Toroidal Fuel Tank'...
  'Oscar-B Fuel Tank'];

fuel_full_mass = [82 41 36 20.5 18 9 4.5 4.5 2.25 1.125 0.5625 0.136 0.078675];

fuel_empty_mass = [10 5 4 2.5 2 1 0.5 0.5 0.25 0.125 0.0625 0.025 0.015];

I don't think the problem is in the MATLAB code, though. I think it's a conceptual problem I'm having. If acceleration due to gravity is perpendicular (has no affect on) orbital velocity, why do orbiting objects get faster near the gravitational body?
 
Thats large? Medium for programming is 10K lines and large is 100K lines...
 
jedishrfu said:
Thats large? Medium for programming is 10K lines and large is 100K lines...

My program is plenty large! D:<

Can you help me understand orbits jedish, or are you satisfied with insulting the length and girth of my program? ;)
 

Similar threads

  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 12 ·
Replies
12
Views
4K
  • · Replies 3 ·
Replies
3
Views
3K
Replies
24
Views
4K
  • · Replies 7 ·
Replies
7
Views
4K
  • · Replies 6 ·
Replies
6
Views
8K
  • · Replies 7 ·
Replies
7
Views
3K
  • · Replies 45 ·
2
Replies
45
Views
7K
  • · Replies 5 ·
Replies
5
Views
5K
  • · Replies 7 ·
Replies
7
Views
3K