Как вы оцениваете функции из списка в MATLAB?
У меня есть проблема, когда мне нужно оценить кучу функций, которые хранятся в списке.
У меня есть функция dg и значения параметров для 'a' и 'b' в paramList:
syms a b x;
dg = symfun((a*exp(-a*(x-b)))/((1+exp(-a*(x-b)))^2),[a b x]);
paramList = [0.18, 20; 0.25, 25; 0.35, 15; 0.3, 20; 0.33, 30];
и нужно составить список этих функций f(x) с различными значениями параметров для "a" и "b".
У меня есть функция, которая может сделать это:
function [ out ] = getFunList( paramList, func )
syms a b x;
s = size(paramList);
s = s(1);
out = symfun.empty(1,s);
for i = 1:s
newFun = subs(func,a,paramList(i,1));
newFun = subs(newFun,b,paramList(i,2));
out(1,i) = newFun;
end
end
Использование вышеуказанной функции приведет к
>> funList = getFunList(paramList,dg)
funList =
[ (9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2), exp(25/4 - x/4)/(4*(exp(25/4 - x/4) + 1)^2), (7*exp(21/4 - (7*x)/20))/(20*(exp(21/4 - (7*x)/20) + 1)^2), (3*exp(6 - (3*x)/10))/(10*(exp(6 - (3*x)/10) + 1)^2), (33*exp(99/10 - (33*x)/100))/(100*(exp(99/10 - (33*x)/100) + 1)^2)]
но если я попытаюсь оценить отсюда, это не сработает:
>> subs(funList(1,1),x,5)
ans =
(9*exp(27/10))/(50*(exp(27/10) + 1)^2)
Есть ли способ получить последнее выражение для точной оценки?
>> eval(funList(1))
ans =
(9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2)
не работает
Или есть хороший способ хранить массив ячеек анонимных функций? Я пробовал это, но я не могу понять, как создавать анонимные функции из переменных. Например:
>> cellarr = cell(1,3)
>> cellarr{1} = @(x) eval(funList(1))
cellarr =
@(x)eval(funList(1)) [] []
>>
Это не производит то, что я хочу. Я не уверен, как получить массив ячеек для хранения
@(x) (9*exp(18/5 - (9*x)/50))/(50*(exp(18/5 - (9*x)/50) + 1)^2)
но извлечено из переменной.
Любая помощь будет отличной. Благодарю.
2 ответа
Вам действительно нужен Symfun? Кажется, в вашем случае функциональные ручки хороши.
f=@(a,b,x)((a*exp(-a*(x-b)))/((1+exp(-a*(x-b)))^2))
paramList = [0.18, 20; 0.25, 25; 0.35, 15; 0.3, 20; 0.33, 30];
for rw=1:size(paramList,1)
fcnList{rw}=@(x)f(paramList(rw,1),paramList(rw,2),x);
end
Это создает список. Если вы просто хотите оценить использование:
fcnList{1}(5)
Или чтобы получить выражение:
fcnList{1}(sym('x'))
Важно хранить функции в массиве ячеек. Массивы функций невозможны. Для symfuns вы получаете функцию, возвращающую массив вместо массива функций.
Еще одна вещь, которую вы могли бы сделать, это изменить getFunList
так что он выводит массив ячеек. Затем вы можете индексировать в конкретную ячейку, которая обращается к функции, которую вы хотите, а затем вы можете вызвать subs
на этой функции. Что-то вроде:
function [ out ] = getFunList( paramList, func )
syms a b x;
s = size(paramList);
s = s(1);
out = {}; %// Change
for i = 1:s
newFun = subs(func,a,paramList(i,1));
newFun = subs(newFun,b,paramList(i,2));
out{i} = newFun; %// Change
end
end
Далее вы можете получить любую функцию и заменить x
значение как так:
>> subs(funList{1},x,5)
ans(a, b, x) =
(9*exp(27/10))/(50*(exp(27/10) + 1)^2)