2015-01-21 3 views
0

У меня проблема, когда мне нужно оценить набор функций, которые хранятся в списке.Как вы оцениваете функции из списка в MATLAB

У меня есть функция дг и значения параметров для «а» и «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 (х) с различными значениями параметров для «а 'и' 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) 

но извлечен из переменной.

Любая помощь будет отличной. Благодарю.

+0

Что вы имеете в виду «оценить точно»? Вы хотите представление с плавающей запятой? То, что вы сделали с 'subs (funList (1,1), x, 5), кажется мне прекрасным. – rayryeng

ответ

0

Вам действительно нужен симфун? Кажется, что в вашем случае отлично работают функции.

[email protected](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}[email protected](x)f(paramList(rw,1),paramList(rw,2),x); 
end 

Это генерирует список. В случае, если вы просто хотите, чтобы оценить использование:

fcnList{1}(5) 

Или, чтобы получить выражение:

fcnList{1}(sym('x')) 

Важно, чтобы сохранить функции в массиве ячеек. Массивы функций невозможны. Для symfuns вы получаете функцию, возвращающую массив вместо массива функций.

+0

Это помогло. Спасибо! – Termnus

2

Еще одна вещь, которую вы могли бы сделать, это изменить свой 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) 
Смежные вопросы