Plotting the integral without getting negative domain results?
1 次查看(过去 30 天)
显示 更早的评论
So I need to graph the magnitude of equation 2 (I labeled them in the comments) but I am not getting what is expected for the plots of the magnitudes of equation 2. It should be a graph that starts out at some y value that is high up on the y scale, and then over the frequency (which is the x value) gradually slope down in a curved fashion till it hits 0. an easy way to describe what I am supposed to get would be an upside down e^x graph. Does anyone have any suggestions as to what I need to do to my code to get these results? I have been struggling trying to get the right result now for a week. :/
if true
format long
a = 1
b = 3E-7
c = 5E-8
f0 = 4E9
sigma = 0.2
t0 = 0
tmax = 2.*b
f = linspace(1E6,1E10)
t = linspace(t0, tmax)
omega = 2.*pi.*f
omega0 = 2.*pi.*f0
yt = a.*exp((-(t-b).^2)./((2*c).^2)) % equation (1)
fun = @(t) (yt.*exp(-1i.*omega.*t))
q = abs(integral(fun,0,6E-7, 'ArrayValued',1)) % equation (2)
figure(1)
plot(t,yt) % plot of (1) vs time for t:(0 to 6*10^-7)
figure(2)
plot(f,q) % plot of magnitude of F (eq 2) vs frequency for f:(10^6 to 10^10)
r = q.^2 % square of magnitude of F
figure(3)
plot(f,r) % plot of square of magnitude of F
q2 = integral(@(t) fun(t).^2,3.8E9,4.3E9, 'ArrayValued',1) % integral of square of magnitude of F
figure(4)
plot(f,q2)
% code
end
Here's part of my code that includes what I was talking about above. Any input on what I could do to get the correct result will be highly appreciated!
0 个评论
回答(2 个)
Walter Roberson
2015-8-10
A) You need to increase your resolution beyond the default number of points that linspace() generates
B) your fun is imaginary. squaring it is still imaginary. The integral of an imaginary quantity is imaginary and dependent upon the integration path. You should have noticed the
Warning: Imaginary parts of complex X and/or Y arguments ignored
2 个评论
Walter Roberson
2015-8-10
Your second integral is
integral(@(t) fun(t).^2,3.8E9,4.3E9, 'ArrayValued',1)
which does not use the value of the first integral. And your fun(t) is imaginary.
Star Strider
2015-8-10
See if substituting with this assignment does what you want:
q2 = integral(@(t) fun(t).*conj(fun(t)),3.8E9,4.3E9, 'ArrayValued',1);
10 个评论
Star Strider
2015-8-11
If double variables return NaN and 0, how do you know the uint64 values that do not are accurate? I would stay with double variables, and look closely at the code to see where the errors are if the results are not supposed to be 0. The minimum double-precision floating-point number is 2.2E-308.
Walter Roberson
2015-8-11
So you are using uint64() just because uint64(0)/uint64(0) returns 0 instead of NaN? Why are you not using
X(isnan(X)) = 0;
replacing the NaN with 0
Or perhaps when you do the division A./B,
Bz = B;
Bz(Bz==0) = 1;
A./Bz
so that you divide by 1 instead of 0 in that location, getting 0 as the output ?
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!