change parameter values in anonymous function
22 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
My problem is one function passing to me a Anonymous function handle, for example,
f_handle = function1(a1,a2,....)
% Assuming f_handle = @(x,y) [a*(x+y),b*(x-y)], a and be are unknown parameters
As I only get this handle, (and I know there are two unknown parameters of a and b), now I want to change (set) the parameter values of a and b, I don't know how to do it.
b=1; a=1:10;
x = 1; y =2;
for i=1:10
% how to passing a(i) and b in the anonymouos function
mm{i} = f_handle(x,y);
end
Should I redefine a anonymous function or by other way?
0 Commenti
Risposta accettata
madhan ravi
il 14 Lug 2020
Modificato: madhan ravi
il 14 Lug 2020
b = 1;
a = 1:10;
x = 1;
y = 2;
mm = cell(1, 10);
f_handle = @(x,y,a,b) [a*(x+y),b*(x-y)];
for ii = 1:10
mm{ii} = f_handle(x,y,a(ii),b);
end
celldisp(mm)
9 Commenti
madhan ravi
il 15 Lug 2020
Modificato: madhan ravi
il 15 Lug 2020
n = 1;
m = 2;
save m
f = @(x) x^n+m
F = func2str(f);
str = regexprep(F,'.*\)','');
SYM = str2sym(str);
syms(symvar(SYM))
clear m
load m
subs(subs(SYM, {x,n},{2,3}))
Più risposte (1)
Steven Lord
il 14 Lug 2020
Once you've created an anonymous function handle that "remembers" a particular value, you cannot change that "remembered" value. You would need to recreate the function handle to change it.
n = 2;
f = @(x) x.^n; % n is locked into the value 2 at this point
y1 = f(3) % 9
n = 4;
y2 = f(3) % still 9 not 3^4 = 81
f = @(x) x.^n; % Recreating f "remembers" the new value of n
y3 = f(3) % 81
If you have a value that you want to be able to change, you should probably have the anonymous function accept it. You could, if you need a function with a specific signature, write an adapter. In the example below g accepts both x and n, while f2 and f3 fix specific values for n but make use of g to compute their results.
g = @(x, n) x.^n;
f2 = @(x) g(x, 2);
f3 = @(x) g(x, 3);
5 Commenti
madhan ravi
il 15 Lug 2020
Modificato: madhan ravi
il 15 Lug 2020
Right. I misread OPs comment. What I meant by that was there’s an alternative to overcome that problem.
Mark Wilson
il 21 Giu 2021
Modificato: Mark Wilson
il 21 Giu 2021
I just found this thread while searching for help on some surprising results from odextend(sol,...) and thought I would post my experience here so others can benefit. I was running code similar to this, using ode23 with an anonymous function handle to pass extra parameters, then changing those parameters, and continuing the solution:
aux = [a b];
sol1 = ode23(@(t,y) myfun(t,y,aux),[t0 t1],0);
aux = [c d];
sol2 = odextend(sol1,[],t2);
(Here, [] as the second argument tells odextend to use the same ode function as the original solution.)
However, odextend was internally using aux values of [a b] instead of [c d]. @Steven Lord's answer here taught me that changing the values of the extra parameters in the workspace doesn't affect the function handle stored in sol.extdata.odefun and used by default by odextend(). Once I redefined the anonymous function with the updated aux, it worked.
sol2 = odextend(sol1,@(t,y) myfun(t,y,aux),t2);
This was not clear to me from the odextend documentation.
Vedere anche
Categorie
Scopri di più su Ordinary Differential Equations in Help Center e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!