Итак, у меня есть следующий код
perturb1 =
x'[t] == mu1*x[t] + x[t]*(a*x[t] + b*y[t] + c*z[t]) +
x[t]*eps1 * (UnitStep[t - 1.5] - UnitStep[t - 2.5]);
perturb2 =
y'[t] == mu2*y[t] + y[t]*(d*x[t] + e*y[t] + f*z[t]) +
y[t]*eps2 * (UnitStep[t - 1.5] - UnitStep[t - 2.5]);
perturb3 =
z'[t] == mu3*z[t] + z[t]*(g*x[t] + h*y[t] + i*z[t]) +
z[t]*eps3 * (UnitStep[t - 1.5] - UnitStep[t - 2.5]);
perturbSol = ParametricNDSolve[
{perturb1, perturb2, perturb3, x[0] == 0.25, y[0] == 0.4,
z[0] == 0.35},
{x[t], y[t], z[t]},
{t, 0, 500},
{mu1, mu2, mu3, a, b, c, d, e, f, g, h, i, eps1, eps2, eps3}
];
Evaluate[x[t][#] /. perturbSol] & /@ parameterSets
parameterSets
- это список из 5000+ элементов вида {mu1, mu2, mu3, a, b, c, d, e, f,g, h, i, eps1, eps2, eps3} (но с числовыми значениями).Я пытаюсь оценить параметрическую функцию, используя каждый набор параметров.Когда я делаю, как указано выше, я получаю ошибку
ParametricNDSolve: Too many parameters in {mu1,mu2,mu3,a,b,c,d,e,f,g,h,i,eps1,eps2,eps3} to be filled from {{0.9,0.9,0.9,-2,-1,-1,-1,-2,-1,-1,-1,-2,-2,-2,-2}}.
Так что, похоже, что из-за одного значения вы бы оценили функцию следующим образом:
Evaluate[x[t][0.9,0.9,0.9,-2,-1,-1,-1,-2,-1,-1,-1,-2,-2,-2,-2]/.perturbSol]
Принимая во внимание, когдаиспользуя Map для наборов параметров, он делает это:
Evaluate[x[t][{0.9,0.9,0.9,-2,-1,-1,-1,-2,-1,-1,-1,-2,-2,-2,-2}]/.perturbSol]
то есть применяет функцию к списку из 15 параметров, а не к 15 параметрам, разделенным запятыми.
Есть ли какой-нибудь элегантныйрешение этого?Я попытался сгладить вокруг #, который ничего не делал (как я и ожидал).Я думаю, один из способов - написать # 1, # 2, # 3 и т. Д. В квадратных скобках, но это довольно грязно.
Есть ли лучший способ сделать это?
Большое спасибо,
H