createSimFunction does not use initial-assignment-computed values for MassAction ParameterVariableNames
Ältere Kommentare anzeigen
When a MassAction rate parameter (e.g., `ke`) is set by an initial assignment rule, `createSimFunction` does not use the computed value for the MassAction rate calculation. The parameter IS correctly computed (confirmed by observing it as a SimFunction output), but MassAction uses the pre-assignment `.Value` property instead.
`sbiosimulate` with the same model produces correct results.
Environment
- MATLAB R2025b (25.2.0.3123386)
- SimBiology toolbox
model = sbiomodel("MWE");
cs = getconfigset(model);
cs.SolverType = 'sundials';
cs.SolverOptions.AbsoluteTolerance = 1e-8;
cs.SolverOptions.RelativeTolerance = 1e-8;
cs.CompileOptions.DimensionalAnalysis = true;
cs.CompileOptions.UnitConversion = true;
addcompartment(model, 'Central', ...
'CapacityUnits', 'milliliter', 'ConstantCapacity', false);
addspecies(model.Compartments(1), 'Drug', 0, 'Units', 'milligram/milliliter');
addparameter(model, 'typical_V', 3000, 'Units', 'milliliter');
addparameter(model, 'typical_CL', 200, 'Units', 'milliliter/hour');
addparameter(model, 'BW', 70, 'Units', 'kilogram');
addparameter(model, 'typical_BW', 70, 'Units', 'kilogram');
addparameter(model, 'CL', eps, 'Units', 'milliliter/hour');
addparameter(model, 'ke', eps, 'Units', '1/hour');
% Initial assignments:
% Central = 3000 mL, CL = 200 mL/h, ke = 200/3000 = 0.0667 /h
addrule(model, 'Central = typical_V * (BW / typical_BW)', 'initialAssignment');
addrule(model, 'CL = typical_CL * (BW / typical_BW)', 'initialAssignment');
addrule(model, 'ke = CL / Central', 'initialAssignment');
% MassAction elimination (first-order)
rxn = addreaction(model, 'Central.Drug -> null', 'Name', 'Elimination');
kl = addkineticlaw(rxn, 'MassAction');
kl.ParameterVariableNames = 'ke';
% Dose
dose = sbiodose('IV', 'schedule');
dose.TargetName = 'Drug';
dose.Amount = 300;
dose.AmountUnits = 'milligram';
dose.TimeUnits = 'hour';
dose.Time = 0;
% --- Method 1: createSimFunction (INCORRECT) ---
F = createSimFunction(model, {}, {'Drug', 'ke', 'CL', 'Central'}, {'Central.Drug'}, ...
'UseParallel', false, 'AutoAccelerate', false);
[~, y] = F([], [], getTable(dose), [0, 10, 100]);
fprintf('createSimFunction:\n');
fprintf(' Drug(t=0)=%g, Drug(t=10h)=%g, Drug(t=100h)=%g\n', y{1}(1,1), y{1}(2,1), y{1}(3,1));
fprintf(' ke=%g, CL=%g, Central=%g (all correct!)\n\n', y{1}(1,2), y{1}(1,3), y{1}(1,4));
% --- Method 2: sbiosimulate (CORRECT) ---
cs.StopTime = 100;
cs.TimeUnits = 'hour';
cs.SolverOptions.OutputTimes = [0, 10, 100];
[~, x, names] = sbiosimulate(model, cs, [], dose);
idx = strcmp(names, "Drug");
fprintf('sbiosimulate:\n');
fprintf(' Drug(t=0)=%g, Drug(t=10h)=%g, Drug(t=100h)=%g\n', x(1,idx), x(2,idx), x(3,idx));
Output
createSimFunction:
Drug(t=0)=0.1, Drug(t=10h)=0.0999815, Drug(t=100h)=0.099815
ke=0.0666667, CL=200, Central=3000 (all correct!)
sbiosimulate:
Drug(t=0)=0.1, Drug(t=10h)=0.0513417, Drug(t=100h)=0.000127269
Expected Behavior
Both methods should produce identical results. Expected half-life = ln(2) / 0.0667 = 10.4 hours. `sbiosimulate` is correct; `createSimFunction` shows ~1000x slower elimination.
Key Observation
The initial assignments ARE evaluated correctly in `createSimFunction` — `ke=0.0667`, `CL=200`, `Central=3000` are all reported with correct values when observed as SimFunction outputs. However, the MassAction rate calculation does not use the computed `ke` value; it appears to use the pre-assignment `.Value` (eps).
Notes
- This pattern (`ke = CL/V` as initial assignment, MassAction with `ke`) is the same pattern used by SimBiology's own `PKCompartment.m` source code for "linear-clearance" elimination (lines 132-142 in R2025b).
- The issue is not specific to chained initial assignments — even `ke = typical_CL / typical_V` (single-level, depending only on directly-set parameters) exhibits the same behavior.
- The `Constant` property of the parameters does not affect the outcome.
- `AutoAccelerate = true` does not fix the issue.
Akzeptierte Antwort
Weitere Antworten (0)
Communitys
Weitere Antworten in SimBiology Community
Kategorien
Mehr zu Perform Sensitivity Analysis finden Sie in Hilfe-Center und File Exchange
Produkte
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!