createSimFunction does not use initial-assignment-computed values for MassAction ParameterVariableNames
Mostrar comentarios más antiguos
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.
Respuesta aceptada
Más respuestas (0)
Comunidades de usuarios
Más respuestas en SimBiology Community
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!