Hi all,
Is it possible to use dot indexing in a function handle? Or at least ignore an output?
Please look at the code below.
clear
clc
close
format shortG
P = 100;
vel = 1.5066e+03;
omegab = 0;
L = 30480;
E = 200000;
I = 1.6253e6;
b = 2438;
h = 20;
A = b * h;
rho = 7.8E-9;
jmax = 5;
varMean = [P vel];
varStd = abs([0.15 0.15] .* varMean);
varDist = ["normal","normal"];
g = @(X) 1.76 - beamUnderMovingLoad(X(1),X(2),L,E,I,omegab,rho,A,jmax);
inputs = struct('means', varMean, 'stds', varStd, 'dists', varDist, 'g_func', g, 'N', 10000);
output = monteCarloSimulation(inputs)
output.Pf
output.Beta
It runs properly when the function 'beamUnderMovingLoad()' has only one output, but Id like to select the output in the 'g' function.
Trust all clear!

 Réponse acceptée

Rik
Rik le 10 Mar 2023
Modifié(e) : Rik le 10 Mar 2023
You will have to write a wrapper that can select an output for you. There is no built-in functionality to do so.
Some like this should work:
function out=output_selector(fun,k,varargin)
% Select the k-th output variable given some input.
% The first input should be a function handle. Any inputs required for the
% function can provided as extra arguments.
out = cell(1,k);
[out{:}]=fun(varargin{:});
out = out{end};
end

8 commentaires

Geovane Gomes
Geovane Gomes le 10 Mar 2023
Thanks Rik, but it did not work.
I'd like to select for example the 2nd output of 'beamUnderMovingLoad()' to use in the 'g' function handle
Rik
Rik le 10 Mar 2023
What code did you write?
I edited this line
g = @(X) 1.76 - output_selector(beamUnderMovingLoad(X(1),X(2),X(3),E,I,omegab,rho,A,jmax),2,varargin)
It might have helped if you had read the documentation for varargin, which might have given you the idea for how to use it.
The problem is that you provided the output of the function, not the function itself to output_selector.
The line below should do the trick.
g = @(X) 1.76 - output_selector(@beamUnderMovingLoad,2,X(1),X(2),X(3),E,I,omegab,rho,A,jmax)
This way did not work also.
Note the error message: Operator '-' is not supported for operands of type cell.
If I remove the term '1.76 -', it shows 'Conversion to double from cell is not possible'.
Both errors happen when 'g_func' is evaluated in the monteCarloSimulation function
Here is the line:
X = randomNumberGenerator(N, n_vars, dists, means, stds);
G = zeros(N, 1); % Pre-allocate memory for the limit state function
for i = 1:N
G(i) = g_func(X(i,:)); % Evaluate limit state function for each sample
end
Rik
Rik le 10 Mar 2023
Ah, that is the downside of writing that function on mobile. It should have been out = out{end}; instead of out = out(end);.
I'll edit my answer.
Geovane Gomes
Geovane Gomes le 10 Mar 2023
Wow!!!
Now it works perfect!
i really appreciate your help
Rik
Rik le 10 Mar 2023
You're welcome

Connectez-vous pour commenter.

Plus de réponses (0)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by