Basic problem, but I can't find the solution:
consider basic a for loop:
for i = 1:5
z(i)=3*i
end
It produces a vector z= [3 6 9 12 15]. What I need is all the components of the vector z as a sperate variables(scalars), let,s say
z1=3, z2=6 and so on. How can I do that?
Thanks in advance
Roger Kalvig

댓글 수: 4

Stephen23
Stephen23 2022년 6월 21일
"What I need is all the components of the vector z as a sperate variables(scalars)"
Why?
What do you imagine that you can do with lots of scalars, that is not possible using indexing?
"say z1=3, z2=6 and so on."
KSSV
KSSV 2022년 6월 21일
Already you have that in hand.
z(1), z(2),...z(n) etc.,
Roger Kalvig
Roger Kalvig 2022년 6월 21일
Ok seems I need to describe my entire problem instead of decomposing it into pieces.
The goal is to perform numerical integracion of two functions. One of them is my function fcn looking like this:
function y = fcn(x)
Bext = 0.6;
G = 10.553;
if x < 0
y = 0;
elseif x == 0
y = 100;
elseif x == 180
y = 100;
elseif x > 180
y = 0;
else
y = 1./(G.*Bext.*(sind(x)));
end
end
which is simple relationship defined for 3 ranges and 2 x points.
The second function is Gaussian function:
function y = myGausstest(x)
A = 10;
w = 20;
xc = 90;
y = A.*exp(-0.5*((x-xc)./w).^2);
end
Now fcn is always constant, but Gauss is moving along x axis. All parameters of Gauss function remain constat except xc. So my idea was to create a for loop:
for xc = -100:10:280 (some range suiting fcn function)
"do integration here of the product of both functions fcn*myGausstest for integral limts (xc-d,xc+d)" using trapz or integral
end
Finally I need do plot the result
plot(x, result of integration)
Any help is appreciated.
Roger Kalvig

댓글을 달려면 로그인하십시오.

 채택된 답변

Stephen23
Stephen23 2022년 6월 21일
편집: Stephen23 2022년 6월 21일

0 개 추천

Rather than distracting with anti-pattern numbered variables (like you asked about), instead you should just use basic, normal, efficient, easy, simple, standard indexing. Indexing is how MATLAB works best.
d = 5;
xc = -100:10:280; % (some range suiting fcn function)
iv = nan(1,numel(xc));
fh = @(x) fcn(x) .* myGausstest(x);
for k = 1:numel(xc)
% do integration here of the product of both functions fcn*myGausstest for integral limts (xc-d,xc+d)" using trapz or integral
iv(k) = integral(fh,xc(k)-d,xc(k)+d);
end
Warning: Reached the limit on the maximum number of intervals in use. Approximate bound on error is 6.7e-03. The integral may not exist, or it may be difficult to approximate numerically to the requested accuracy.
Warning: Minimum step size reached near x = 180. There may be a singularity, or the tolerances may be too tight for this problem.
plot(xc,iv)
function y = fcn(x)
Bext = 0.6;
G = 10.553;
y = 1./(G.*Bext.*sind(x));
y(x<0) = 0;
y(x==0) = 100;
y(x==180) = 100;
y(x>180) = 0;
end
function y = myGausstest(x)
A = 10;
w = 20;
xc = 90;
y = A.*exp(-0.5*((x-xc)./w).^2);
end

댓글 수: 3

Roger Kalvig
Roger Kalvig 2022년 6월 21일
One problem i can see is I already defined xc within
function y = myGausstest(x)
A = 10;
w = 20;
xc = 90;
y = A.*exp(-0.5*((x-xc)./w).^2);
end
so idea is to express Gauss in fh explicitely:
fh = @(x) fcn(x) .* A.*exp(-0.5*((x-xc)./w).^2);
but again, matrix dimensions are incorrect.
Stephen23
Stephen23 2022년 6월 21일
편집: Stephen23 2022년 6월 21일
"One problem i can see is I already defined xc within"
Presumably you only intend the xc inside the function to refer to a single value, not the entire vector, in which case you can easily pass the value by parameterizing the function:
For example:
d = 5;
xc = -100:10:280; % (some range suiting fcn function)
iv = nan(1,numel(xc));
for k = 1:numel(xc)
fh = @(x) fcn(x) .* myGausstest(x,xc(k)); % parameterize function
iv(k) = integral(fh,xc(k)-d,xc(k)+d);
end
Warning: Reached the limit on the maximum number of intervals in use. Approximate bound on error is 1.7e+02. The integral may not exist, or it may be difficult to approximate numerically to the requested accuracy.
Warning: Minimum step size reached near x = 180. There may be a singularity, or the tolerances may be too tight for this problem.
plot(xc,iv)
function y = fcn(x)
Bext = 0.6;
G = 10.553;
y = 1./(G.*Bext.*sind(x));
y(x<0) = 0;
y(x==0) = 100;
y(x==180) = 100;
y(x>180) = 0;
end
function y = myGausstest(x,xc)
A = 10;
w = 20;
y = A.*exp(-0.5*((x-xc)./w).^2);
end
Roger Kalvig
Roger Kalvig 2022년 6월 21일
Thanks very much for help

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

도움말 센터File Exchange에서 Numerical Integration and Differentiation에 대해 자세히 알아보기

태그

질문:

2022년 6월 21일

편집:

2022년 6월 21일

Community Treasure Hunt

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

Start Hunting!

Translated by