Definite integral in (embedded) Matlab function, with passing additional parameters to the integrand

Hi,
I have a simulation file to model the dynamic behaviour of system, at each time step , I need to evaluate a time-independent integral. To do so I use (embedded) Matlab function but I got many errors. Any help would be appreciated.
inside my (embedded) Matlab function is:
%%________________ method one
function forces=my_embeded_func(positions)
y1=position(1);
y2=position(2);
forces=integral(@(theta),y1+y2*theta,0,2*pi)
end
%_______________
Notes: 1-my integrand is actually very complicated but I put something simple here.
2-I have been told to use "quadgk" instead of "inregra;", but it did not worked
3- I also tried the following method but it did not helped!
%%________________ method two
function forces=my_embeded_func(positions)
coder.extrinsic('myFunc')
y1=position(1);
y2=position(2);
forces=myFunc(y1,y2)
end
% where
function a=myFunc(y1,y2)
a=quadgk(@(theta),y1+y2*theta,0,2*pi)
end
%_______________
Thanks,
Ehsan

 採用された回答

Mike Hosea
Mike Hosea 2014 年 12 月 18 日
編集済み: Mike Hosea 2014 年 12 月 18 日
If you don't need to generate code for your model, I think you can use your second approach, but you need to fix a few unrelated errors. Put myFunc into a MATLAB file myFunc.m. There is a syntax error. Remove the comma between @(theta) and y1:
function a=myFunc(y1,y2)
a=quadgk(@(theta)y1+y2*theta,0,2*pi)
end
Now let's consider your block code. I didn't know whether you meant for your variable to be called "positions" or "position". I just picked one. Second, to call an extrinsic function, you have to pre-allocate the output to tell the compiler how to interpret the mxArray that comes back from MATLAB. The block code should look something like this:
function forces=my_embeded_func(position)
coder.extrinsic('myFunc')
y1=position(1);
y2=position(2);
% Define the output type for myFunc, in this case a scalar double.
forces=0;
% Evaluate myFunc in MATLAB.
forces=myFunc(y1,y2)
end
If you do need to generate code, the way I tell people to do this is to use persistent variables to store the parameters of the function. The whole thing could go into the block.
function forces=my_embeded_func(position)
y1=position(1);
y2=position(2);
forces=myFunc(y1,y2);
end
function a=myFunc(y1,y2)
integrand('set positions',y1,y2);
a=quadgk(@integrand,0,2*pi);
end
function v = integrand(theta,y1set,y2set)
persistent y1 y2
if isempty(y1)
y1 = 0;
y2 = 0;
end
% More than one input means we are setting the persistent
% parameter values, not evaluating the integrand function
% on this particular call. The theta argument is ignored.
% We make it a string 'set positions' in the calling code
% solely for readability.
if nargin > 1
y1 = y1set;
y2 = y2set;
% nargout had better be zero, since we haven't set v.
return
end
v = y1 + y2*theta;
end

2 件のコメント

Ehsan Asadi
Ehsan Asadi 2014 年 12 月 18 日
編集済み: Ehsan Asadi 2014 年 12 月 19 日
Thanks Mike,
It worked perfectly, just a quick question: With respect to simulation speed, which one is faster if I have to do this integral multiple time (in a loop) in each iteration?
I have a relatively complicated integrand which make the computing time very important for me.
Thanks you,
Ehsan
Mike Hosea
Mike Hosea 2014 年 12 月 19 日
It could go either way depending on the integrand, but my guess would be the persistent approach rather than the extrinsic.

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

その他の回答 (0 件)

カテゴリ

ヘルプ センター および File Exchange で Introduction to Installation and Licensing についてさらに検索

製品

質問済み:

2014 年 12 月 18 日

コメント済み:

2014 年 12 月 19 日

Community Treasure Hunt

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

Start Hunting!

Translated by