Как использовать динамическое имя функции в MATLAB? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь оптимизировать следующую программу, используя for loops

t = 0:0.1:100;   
conc = rand(size(t));

syms x

equ_1(x) = 10*x.^2+1;
equ_2(x) = 5*x.^3+10*x.^2;
equ_3(x) = 5*x.^3+10*x.^2;

y_1 = equ_1(conc);
y_2 = equ_2(conc);
y_3 = equ_3(conc);

p_1 = polyfit(t,y_1,1);
p_2 = polyfit(t,y_2,1);
p_3 = polyfit(t,y_3,1);

yfit_1 = p_1(1)*conc+p_1(2);
yfit_2 = p_2(1)*conc+p_2(2);
yfit_3 = p_2(1)*conc+p_2(2);

rms_er_1 = double(sqrt((sum((yfit_1-y_1).^2)./length(yfit_1))));
rms_er_2 = double(sqrt((sum((yfit_2-y_2).^2)./length(yfit_2))));
rms_er_3 = double(sqrt((sum((yfit_3-y_3).^2)./length(yfit_3))));


rms = [rms_er_1 rms_er_2 rms_er_3]

В этой программе.У меня много уравнений, и я могу написать их вручную, например equ_1(x),equ_1(x),equ_1(x) и т. Д. После написания уравнений можно ли будет писать оставшиеся программы, используя циклы for?

Кто-нибудь может помочь?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы можете попробовать cellfun

Вот пример.

Определите в .m

function y = your_complex_operation(f,x, t)
y_1 = f(x);
p_1 = polyfit(t,y_1,1);
yfit_1 = p_1(1)*x+p_1(2);
y = double(sqrt((sum((yfit_1-y_1).^2)./length(yfit_1))));
end

Затем используйте cellfunc

funs{1}=@(x) 10*x.^2+1;
funs{2}=@(x) 5*x.^3+10*x.^2;
funs{3}=@(x) 5*x.^3+10*x.^2;
%as many as you need

t = 0:0.1:100;
conc = rand(size(t));

funs_res = cellfun(@(c) your_complex_operation(c,conc,t),funs);
0 голосов
/ 02 октября 2018

Да, это возможно.Вы можете упаковать свои функции в массив ячеек и указать их значения в качестве параметров при цикле по этому массиву ячеек

t = (0:0.1:100)';   
conc = rand(size(t));

% Packing your function handles in a cell array ( I do not have the 
% symbolic math toolbox, so I used function handles here. In your case you
% have to pack your equations equ_n(x) in between the curly brackets{} )
allfuns = {@(x) 10*x.^2+1, ...
    @(x) 5*x.^3+10*x.^2, ...
    @(x) 5*x.^3+10*x.^2};

% Allocate memory
y = zeros(length(t), length(allfuns));
p = zeros(2,length(allfuns));
yfit = zeros(length(t), length(allfuns));
rms = zeros(1, length(allfuns));

% Loop over all functions the cell, applying your functional chain
for i=1:length(allfuns)
    y(:,i) = allfuns{i}(t);
    p(:,i) = polyfit(t,y(:,i),1);
    yfit(:,i) = p(1,i)*conc+p(2,i);
    rms(:,i) = double(sqrt((sum((yfit(:,i)-y(:,i)).^2)./ ...
        length(yfit(:,i)))));
end

Это приводит к

>> rms

rms =

   1.0e+06 *

    0.0578    2.6999    2.6999

Вы можете расширить это до произвольного числауравнений в allfuns.

Кстати: вы подгоняете многочлены 1-го порядка с polyfit к значениям, рассчитанным с помощью функций 2-го и 3-го порядка.Это приводит, конечно, к грубым припадкам с максимумом rms.Я не знаю, как выглядит ваша полная проблема, но вы можете определить массив poly_orders, содержащий полиномиальный порядок каждой функции в allfuns.Если вы дадите эти значения в качестве параметра для функции polyfit в цикле, ваши подгонки будут работать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...