You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GMAT卫星星座面内调相代码VF13ad迭代异常问题问询

GMAT星座面内调相优化问题排查(VF13ad仅1次迭代停止)

问题背景

开发GMAT代码实现3颗地球轨道卫星的面内调相:初始相位差3°,SC1不执行有限推力,仅允许面内推力操作,目标是在满足约束、达到半长轴SMA_TARGET=6931的前提下最小化总推力。采用VF13ad优化器时,代码仅完成1次迭代就停止,需排查原因。

完整代码(含自定义函数)

Create Spacecraft SC1;
GMAT SC1.DateFormat = TAIGregorian;
GMAT SC1.Epoch = '01 Jan 2025 12:00:00.000';
GMAT SC1.CoordinateSystem = EarthMJ2000Eq;
GMAT SC1.DisplayStateType = Keplerian;
GMAT SC1.SMA = 6951.000000000003;
GMAT SC1.ECC = 0.01;
GMAT SC1.INC = 97.51000000000001;
GMAT SC1.RAAN = 20.00000000000001;
GMAT SC1.AOP = 0;
GMAT SC1.TA = 0.0000; %equally scattered by 3 deg at launcher deployment
GMAT SC1.Tanks = {TANK};
GMAT SC1.Thrusters = {IP_THRUSTER};

Create Spacecraft SC2;
GMAT SC2.DateFormat = TAIGregorian;
GMAT SC2.Epoch = '01 Jan 2025 12:00:00.000';
GMAT SC2.CoordinateSystem = EarthMJ2000Eq;
GMAT SC2.DisplayStateType = Keplerian;
GMAT SC2.SMA = 6950.999999999988;
GMAT SC2.ECC = 0.01;
GMAT SC2.INC = 97.51000000000001;
GMAT SC2.RAAN = 20.00000000000001;
GMAT SC2.AOP = 0;
GMAT SC2.TA = -3.0000; %equally scattered by 3 deg at launcher deployment
GMAT SC2.Tanks = {TANK};
GMAT SC2.Thrusters = {IP_THRUSTER};

Create Spacecraft SC3;
GMAT SC3.DateFormat = TAIGregorian;
GMAT SC3.Epoch = '01 Jan 2025 12:00:00.000';
GMAT SC3.CoordinateSystem = EarthMJ2000Eq;
GMAT SC3.DisplayStateType = Keplerian;
GMAT SC3.SMA = 6950.999999999991;
GMAT SC3.ECC = 0.01;
GMAT SC3.INC = 97.51000000000001;
GMAT SC3.RAAN = 20.00000000000001;
GMAT SC3.AOP = 0;
GMAT SC3.TA = -6.00000; %equally scattered by 3 deg at launcher deployment
GMAT SC3.Tanks = {TANK};
GMAT SC3.Thrusters = {IP_THRUSTER};

%----------------------------------------
%---------- Hardware Components
%----------------------------------------
Create ChemicalTank TANK;
GMAT TANK.AllowNegativeFuelMass = false;
GMAT TANK.FuelMass = 15;
GMAT TANK.Pressure = 1500;
GMAT TANK.Temperature = 20;
GMAT TANK.RefTemperature = 20;
GMAT TANK.Volume = 0.75;
GMAT TANK.FuelDensity = 1260;
GMAT TANK.PressureModel = PressureRegulated;

Create ChemicalThruster IP_THRUSTER;
GMAT IP_THRUSTER.CoordinateSystem = Local;
GMAT IP_THRUSTER.Origin = Earth;
GMAT IP_THRUSTER.Axes = VNB;
GMAT IP_THRUSTER.ThrustDirection1 = 1; %ZBODY
GMAT IP_THRUSTER.ThrustDirection2 = 0; %YBODY
GMAT IP_THRUSTER.ThrustDirection3 = 0; %XBODY
GMAT IP_THRUSTER.DutyCycle = 1;
GMAT IP_THRUSTER.ThrustScaleFactor = 1;
GMAT IP_THRUSTER.DecrementMass = false;
GMAT IP_THRUSTER.Tank = {TANK};
GMAT IP_THRUSTER.MixRatio = [ 1];
GMAT IP_THRUSTER.GravitationalAccel = 9.81;
GMAT IP_THRUSTER.C1 = -3.9;
GMAT IP_THRUSTER.K1 = 450;

%---------------------------------------
%---------- ForceModels
%----------------------------------------

Create ForceModel FM;
GMAT FM.CentralBody = Earth;
GMAT FM.PrimaryBodies = {Earth};
GMAT FM.SRP = On;
GMAT FM.RelativisticCorrection = Off;
GMAT FM.ErrorControl = RSSStep;
GMAT FM.GravityField.Earth.Degree = 20;
GMAT FM.GravityField.Earth.Order = 20;
GMAT FM.GravityField.Earth.StmLimit = 100;
GMAT FM.GravityField.Earth.PotentialFile = 'JGM2.cof';
GMAT FM.GravityField.Earth.TideModel = 'None';
GMAT FM.SRP.Flux = 1367;
GMAT FM.SRP.SRPModel = Spherical;
GMAT FM.SRP.Nominal_Sun = 149597870.691;
GMAT FM.Drag.AtmosphereModel = MSISE90;
GMAT FM.Drag.HistoricWeatherSource = 'ConstantFluxAndGeoMag';
GMAT FM.Drag.PredictedWeatherSource = 'ConstantFluxAndGeoMag';
GMAT FM.Drag.CSSISpaceWeatherFile = 'SpaceWeather-All-v1.2.txt';
GMAT FM.Drag.SchattenFile = 'SchattenPredict.txt';
GMAT FM.Drag.F107 = 150;
GMAT FM.Drag.F107A = 150;
GMAT FM.Drag.MagneticIndex = 3;
GMAT FM.Drag.SchattenErrorModel = 'Nominal';
GMAT FM.Drag.SchattenTimingModel = 'NominalCycle';
GMAT FM.Drag.DragModel = 'Spherical';

%-----------------------------------------------
%---------- Propagator
%-----------------------------------------------
Create Propagator Propagator_RK;
GMAT Propagator_RK.FM = FM;
GMAT Propagator_RK.Type = PrinceDormand78;
GMAT Propagator_RK.InitialStepSize = 60;
GMAT Propagator_RK.Accuracy = 0.01;
GMAT Propagator_RK.MinStep = 0;
GMAT Propagator_RK.MaxStep = 300;
GMAT Propagator_RK.MaxStepAttempts = 500;
GMAT Propagator_RK.StopIfAccuracyIsViolated = true;

%----------------------------------------
%---------- Burns
%----------------------------------------
Create FiniteBurn IP_BURN;
GMAT IP_BURN.Thrusters = {IP_THRUSTER};
GMAT IP_BURN.ThrottleLogicAlgorithm = 'MaxNumberOfThrusters';

%----------------------------------------
%---------- Solvers
%----------------------------------------
Create VF13ad VF13ad1;
GMAT VF13ad1.ShowProgress = true;
GMAT VF13ad1.ReportStyle = Debug;
GMAT VF13ad1.ReportFile = 'VF13adVF13ad1.data';
GMAT VF13ad1.MaximumIterations = 200;
GMAT VF13ad1.Tolerance = 1;
GMAT VF13ad1.UseCentralDifferences = false;
GMAT VF13ad1.FeasibilityTolerance = 1;

%----------------------------------------
%---------- Functions
%----------------------------------------
Create GmatFunction phasing_function;
GMAT phasing_function.FunctionPath = 'C:\\Users\\antdi\\OneDrive\\Desktop\\GMAT\\userfunctions\\gmat\\phasing_function.gmf';

%----------------------------------------
%---------- Arrays, Variables, Strings
%----------------------------------------
Create Array PHASING_AOL[2,1];
Create Variable SMA_TARGET DV DPH12 DPH13 AOL1 AOL2 AOL3;
GMAT PHASING_AOL(1, 1) = 120;
GMAT PHASING_AOL(2, 1) = 240;
GMAT SMA_TARGET = 6931; %476 km

%----------------------------
%---------- Mission Sequence
%----------------------------
BeginMissionSequence;

GMAT AOL1=SC1.TA+SC1.AOP;
GMAT AOL2=SC2.TA+SC2.AOP;
GMAT AOL3=SC3.TA+SC3.AOP;

GMAT DPH12 = phasing_function(AOL1, AOL2);
GMAT DPH13 = phasing_function(AOL1, AOL3);

Optimize VF13ad1 {SolveMode = Solve, ExitMode = SaveAndContinue, ShowProgressWindow = true};

Vary VF13ad1(SC2.IP_THRUSTER.C1 = -3.9, {Perturbation = 0.001, MaxStep = 0.1});
Vary VF13ad1(SC3.IP_THRUSTER.C1 = -3.9, {Perturbation = 0.001, MaxStep = 0.1});

BeginFiniteBurn IP_BURN(SC2);
BeginFiniteBurn IP_BURN(SC3);

%GMAT expects Parameter of Spacecraft to be on the LHS of Stopping Condition when using the Propagator.
%DPH12 = PHASING_TA(1,1) is not a predefined Parameter and cannot be put as a Stopping Condtion. Then:
%Phasing Constraints shall be in the NonLinearConstraint.

Propagate Propagator_RK(SC1) {SC1.SMA = SMA_TARGET, StopTolerance=5};
Propagate Propagator_RK(SC2) {SC2.SMA = SMA_TARGET, StopTolerance=5};
Propagate Propagator_RK(SC3) {SC3.SMA = SMA_TARGET, StopTolerance=5};

EndFiniteBurn IP_BURN(SC2);
EndFiniteBurn IP_BURN(SC3);

%#SC1
NonlinearConstraint VF13ad1(SC1.ElapsedDays<=365);

%#SC2
NonlinearConstraint VF13ad1(SC2.IP_THRUSTER.C1<=4);
NonlinearConstraint VF13ad1(SC2.ElapsedDays<=365);
NonlinearConstraint VF13ad1(DPH12=PHASING_AOL(1, 1));

%#SC3
NonlinearConstraint VF13ad1(SC3.IP_THRUSTER.C1<=4);
NonlinearConstraint VF13ad1(SC3.ElapsedDays<=365);
NonlinearConstraint VF13ad1(DPH13=PHASING_AOL(2, 1));

GMAT DV = Abs(SC2.IP_THRUSTER.C1+SC3.IP_THRUSTER.C1); %COST FUNCTION
Minimize VF13ad1(DV);

EndOptimize;  % For optimizer VF13ad1

自定义函数phasing_function.gmf

function [DPH]=phasing_function(AOL1, AOL2);
Create Variable DPH, AOL1, AOL2;
BeginMissionSequence;
[DPH] =Abs(AOL1-AOL2);

问题排查与修正方案

1. 优化器参数设置问题

  • 容差过大:当前VF13ad1.Tolerance = 1和FeasibilityTolerance = 1,对于轨道相位(单位为度)和半长轴(单位为km)的约束,1的容差过于宽松,优化器会认为初始状态已满足收敛条件,直接停止迭代。
  • 修正:将容差调整为合理范围,比如:
    GMAT VF13ad1.Tolerance = 0.1;
    GMAT VF13ad1.FeasibilityTolerance = 0.1;
    

2. 相位约束逻辑错误

  • 计算时机错误:当前在优化器外部计算AOL1/AOL2/AOL3和DPH12/DPH13,这些值是初始时刻的相位差,而非调相完成后的最终相位差,导致约束根本没有作用在目标状态上,优化器无调整方向。
  • 修正:将相位计算移到Propagate之后、约束定义之前,确保约束的是调相完成后的状态:
    ...
    EndFiniteBurn IP_BURN(SC3);
    
    % 移到传播完成后计算最终相位差
    GMAT AOL1=SC1.TA+SC1.AOP;
    GMAT AOL2=SC2.TA+SC2.AOP;
    GMAT AOL3=SC3.TA+SC3.AOP;
    GMAT DPH12 = Abs(AOL1-AOL2);
    GMAT DPH13 = Abs(AOL1-AOL3);
    
    %#SC1
    NonlinearConstraint VF13ad1(SC1.ElapsedDays<=365);
    ...
    
    同时可以直接移除自定义函数,简化逻辑。

3. 优化变量选择错误

  • 变量不匹配需求:当前优化的是SC2.IP_THRUSTER.C1和SC3.IP_THRUSTER.C1,这是推力器的校准系数,并非直接控制推力输出的参数(如推力大小、推力时长),优化该参数无法有效调整轨道相位。
  • 修正:选择合理的优化变量,比如有限推力的时长,或者推力缩放因子:
    % 示例:优化SC2和SC3的有限推力时长
    Create Variable BurnDuration2 BurnDuration3;
    GMAT BurnDuration2 = 300;
    GMAT BurnDuration3 = 300;
    
    Optimize VF13ad1 {SolveMode = Solve, ExitMode = SaveAndContinue, ShowProgressWindow = true};
    
    Vary VF13ad1(BurnDuration2 = 300, {Perturbation = 10, MaxStep = 60, Lower=0, Upper=3600});
    Vary VF13ad1(BurnDuration3 = 300, {Perturbation = 10, MaxStep = 60, Lower=0, Upper=3600});
    
    BeginFiniteBurn IP_BURN(SC2);
    Propagate Propagator_RK(SC2) {SC2.ElapsedSecs = BurnDuration2};
    EndFiniteBurn IP_BURN(SC2);
    
    BeginFiniteBurn IP_BURN(SC3);
    Propagate Propagator_RK(SC3) {SC3.ElapsedSecs = BurnDuration3};
    EndFiniteBurn IP_BURN(SC3);
    
    % 之后再传播到目标半长轴,或者整合推力与轨道转移逻辑
    

4. 卫星传播同步问题

  • 时间不同步:当前三颗卫星各自传播到SMA_TARGET,结束时间不一致,导致最终相位差的约束没有意义(不是同一时刻的相位)。
  • 修正:以SC1的传播时长为基准,同步SC2和SC3的传播时间:
    % 先传播SC1到目标半长轴,记录时长
    Propagate Propagator_RK(SC1) {SC1.SMA = SMA_TARGET, StopTolerance=5};
    GMAT TotalTime = SC1.ElapsedSecs;
    
    % SC2和SC3先执行推力,再传播相同时长到目标半长轴(或整合推力到传播过程中)
    BeginFiniteBurn IP_BURN(SC2);
    Propagate Propagator_RK(SC2) {SC2.ElapsedSecs = TotalTime, SC2.SMA = SMA_TARGET, StopTolerance=5};
    EndFiniteBurn IP_BURN(SC2);
    
    BeginFiniteBurn IP_BURN(SC3);
    Propagate Propagator_RK(SC3) {SC3.ElapsedSecs = TotalTime, SC3.SMA = SMA_TARGET, StopTolerance=5};
    EndFiniteBurn IP_BURN(SC3);
    

5. SC1推力器冗余配置

  • SC1不需要执行推力,应移除其Thrusters配置,避免潜在状态干扰:
    Create Spacecraft SC1;
    
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:50:08