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!

 採用された回答

Rik
Rik 2023 年 3 月 10 日
編集済み: Rik 2023 年 3 月 10 日

0 投票

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 件のコメント

Geovane Gomes
Geovane Gomes 2023 年 3 月 10 日
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 2023 年 3 月 10 日
What code did you write?
Geovane Gomes
Geovane Gomes 2023 年 3 月 10 日
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)
Rik
Rik 2023 年 3 月 10 日
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)
Geovane Gomes
Geovane Gomes 2023 年 3 月 10 日
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 2023 年 3 月 10 日
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 2023 年 3 月 10 日
Wow!!!
Now it works perfect!
i really appreciate your help
Rik
Rik 2023 年 3 月 10 日
You're welcome

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

タグ

質問済み:

2023 年 3 月 10 日

コメント済み:

Rik
2023 年 3 月 10 日

Community Treasure Hunt

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

Start Hunting!

Translated by