passing constant parameters to fsolve function, and iterating across parameters

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

passing constant parameters to fsolve function, and iterating across parameters

collin3271
Hello,
New to the forum, and wanted to ask about some code that I have working, but
could use improvement.

In using fsolve to evaluate non-linear equation(s), I wanted to vary some of
the constants in the evaluated equation.

The go-to method seems to be using global defined variables. It seems a bit
messy(in needing to update global list everywhere it was used), so I was
looking for something cleaner to use within functions.

After seeing a note about the movement away from inline functions, I was
able to use an anonymous function (which has access to variables in the
enclosing scope). A detail of this is that the anonymous function has to be
re-stated each time the constants within it are redefined elsewhere.

Questions:
1) It works, but am I sacrificing something by doing this?
2) Is there a non-for-loop method you might think of to evaluating fsolve
across different parameters?

*Example code*, passing script level variable to anonymous function
C = [1 2]; % Parameters in the evaluated equation that do not vary with the
independent variable
anonymous_function = @(x) C(1)*x(1)^2+C(2)*sqrt(x(2)) %Non-linear equation
system to be evaluated
x0=[1,1]; % Set initial values of independent variables in fsolve execution
xout = fsolve(anonymous_function,x0);

*Example Code*, iterating across parameters sent to anonymous
function/fsolve
C_matrix=[1 2;2 3;3 4] % Set of parameters to be used in evaluation
[m n] = size(C_matrix);
x_values = zeros(m,2); % Matrix for storing fsolve output, 2 independent
variables
for i=1:m
 C = C_matrix(i,:); % Select relevant constant parameter set
 anonymous_function = @(x) C(1)*x(1)^2+C(2)*sqrt(x(2))-15; % Re-instantiate
anonymous function to include updated parameters
 x0=[10,100]; % Set initial values of independent variables in fsolve
execution
 xout = fsolve(anonymous_function,x0);
 x_values(i,:) = xout; % Save output of fsolve result for independent
variables
endfor

Thanks for the feedback, massive appreciation for octave and the people who
keep it alive



--
Sent from: http://octave.1599824.n4.nabble.com/Octave-General-f1599825.html


Reply | Threaded
Open this post in threaded view
|

Re: passing constant parameters to fsolve function, and iterating across parameters

karl
Am 19.05.19 um 01:29 schrieb collin3271:

> Hello,
> New to the forum, and wanted to ask about some code that I have working, but
> could use improvement.
>
> In using fsolve to evaluate non-linear equation(s), I wanted to vary some of
> the constants in the evaluated equation.
>
> The go-to method seems to be using global defined variables. It seems a bit
> messy(in needing to update global list everywhere it was used), so I was
> looking for something cleaner to use within functions.
>
> After seeing a note about the movement away from inline functions, I was
> able to use an anonymous function (which has access to variables in the
> enclosing scope). A detail of this is that the anonymous function has to be
> re-stated each time the constants within it are redefined elsewhere.
>
> Questions:
> 1) It works, but am I sacrificing something by doing this?
> 2) Is there a non-for-loop method you might think of to evaluating fsolve
> across different parameters?
>
> *Example code*, passing script level variable to anonymous function
> C = [1 2]; % Parameters in the evaluated equation that do not vary with the
> independent variable
> anonymous_function = @(x) C(1)*x(1)^2+C(2)*sqrt(x(2)) %Non-linear equation
> system to be evaluated
> x0=[1,1]; % Set initial values of independent variables in fsolve execution
> xout = fsolve(anonymous_function,x0);
>
> *Example Code*, iterating across parameters sent to anonymous
> function/fsolve
> C_matrix=[1 2;2 3;3 4] % Set of parameters to be used in evaluation
> [m n] = size(C_matrix);
> x_values = zeros(m,2); % Matrix for storing fsolve output, 2 independent
> variables
> for i=1:m
>   C = C_matrix(i,:); % Select relevant constant parameter set
>   anonymous_function = @(x) C(1)*x(1)^2+C(2)*sqrt(x(2))-15; % Re-instantiate
> anonymous function to include updated parameters
>   x0=[10,100]; % Set initial values of independent variables in fsolve
> execution
>   xout = fsolve(anonymous_function,x0);
>   x_values(i,:) = xout; % Save output of fsolve result for independent
> variables
> endfor
>
> Thanks for the feedback, massive appreciation for octave and the people who
> keep it alive
>
>
>
> --
> Sent from: http://octave.1599824.n4.nabble.com/Octave-General-f1599825.html
>
>
Hi Collin,

maybe this helps:

https://de.mathworks.com/help/optim/ug/passing-extra-parameters.html

Ciao

Charly