Evaluate integral of vectorial function
古いコメントを表示
Dear all i want to evaluate an integral for a function with different values for some parameters but, instead of performing it in a loop, i would like to do it vectorializing
fun = @(x,c) 1./(x.^3-2*x-c);
q = integral(@(x)fun(x,c),0,c)
where the parameter c is a mx1 vector. and the result q of the integration should be a mx1 vector as well. However, if i define c as a vector the integration does not work. In mycase, performing a the integral into a loop is very time consuming. Is there another way?
1 件のコメント
John BG
2016 年 12 月 28 日
are you going to accept an answer among the ones supplied?
would you please be so kind to comment?
採用された回答
その他の回答 (3 件)
Star Strider
2016 年 12 月 25 日
The arrayfun function may do what you want.
See if this works for you:
c = 1:5; % Create ‘c’
fun = @(x,c) 1./(x.^3-2*x-c);
q = @(c) integral(@(x)fun(x,c),0,c);
r = arrayfun(q,c)
David Goodmanson
2016 年 12 月 26 日
Hello Davide, I believe an explicit solution is
cvec = .01:.01:20;
q = [];
for c = cvec
R = roots([1 0 -2 -c]);
r = R(1); s = R(2); t = R(3);
I = real( ((r-s)*(r-t))^-1*log((c-r)/(-r)) ...
+((s-t)*(s-r))^-1*log((c-s)/(-s)) ...
+((t-r)*(t-s))^-1*log((c-t)/(-t)) );
q = [q I]; % should really preallocate instead
end
plot(cvec,q);
There is a pole in q at c = sqrt(3). The values of q to the right of sqrt(3) are probably correct if q is taken to be the principal value of the integral. The code does not work for c exactly at zero.
Walter Roberson
2016 年 12 月 27 日
Your question is ambiguous. Are you doing the equivalent of
for K = 1 : length(c)
this_c = c(K);
result(K) = integral( @(x) fun(x, this_c), 0, this_c);
end
where you are producing one output for each c value, with the individual value of c used in the calculation and also as the upper bound for the same calculation?
Or are you doing the equivalent of
for K_outer = 1 : length(c)
c_outer = c(K_outer);
for K_inner = 1 : length(c)
c_inner = c(K_inner)
result(K_outer, K_inner) = integral( @(x) fun(x, c_inner), 0, c_outer);
end
end
where you are producing one output for each combination of c values?
MATLAB's integral() function cannot handle either possibility with a single step. It can, however, do
for K_outer = 1 : length(c)
c_outer = c(K_outer);
result(K_outer, :) = integral( @(x) fun(x, c), 0, c_outer, 'ArrayValued', true);
end
This unfortunately cannot be converted to handle the case where each corresponding value is used in the function and as the upper bound.
カテゴリ
ヘルプ センター および File Exchange で Calculus についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
