简体   繁体   中英

How to plot this function in MATLAB?

I have a simple function below (I omitted the allocations, etc. for brevity) that I have been tryig to plot against it's x value for specific values of N and T but I keep getting a dimensions error. I think that when I try to plot this I am defining an array for x and then plotting Psum(N', x, T') for certain N' and T' against these x, however MATLAB doesn't seem to like this. Can someone give me some direction please.

function U = Psum(N, X, T)
  for m = 1:N
    A(1,m) = (1/(m*pi))*sin(m*pi*X)*T*exp(-(m^2)*(pi^2)*T);
    % array terms of partial sum
  end
  M = -sum(A); % evaluate Nth partial sum
  U = T*(1-X) + M; % output U(X,T) = T(1-X) + V(X,T)
end

I'm getting a similar error when I try to plot the following, I think there must be something wrong with my general approach

 syms x;
 f = @(x)((x/(100*pi))*(exp(-(100^2)*(pi^2)*x)));
 x = 0:0.1:10000;
 plot(x,f(x),'r')
 title('PartialSum convergence');
 xlabel('T');
 ylabel('a_n');

the error I get here reads:

Error using  * 
Inner matrix dimensions must agree.

Here's the analysis of why you're getting a dimension mismatch error. From this line:

A(1,m) = (1/(m*pi))*sin(m*pi*X)*T*exp(-(m^2)*(pi^2)*T)

The element A(1, m) is supposed to be a scalar value in a two-dimensional matrix. Now let's see what are the dimensions of each of the multiplicands:

  • (1/(m*pi)) is a scalar (that is, a 1×1 matrix).
  • sin(m*pi*X) has the same dimensions as X . Let's assume its dimensions are q×n.
  • exp(-(m^2)*(pi^2)*T) has the same dimensions as T , and is multiplied by T . Therefore T must be a square matrix, so let's assume its dimensions are p×p.

What we get is aq×n matrix multiplied by a square p×p matrix, and the result must be a scalar (that is, 1×1 matrix). This forces q=1 and n=p.

Now let's look at this line:

U = T*(1-X) + M

We are forced to conclude that p=1, otherwise T cannot be multiplied by X from the right.

This means that your code forces T and X to be scalar! No wonder you're getting a error :)

The remedy is simple: revise the computation in Psum so that it can produce correct results for both a scalar X and a vector X . A possible fix would be adding another loop to iterate over all values of X :

function U = Psum(N, X, T)
    U = zeros(size(X));
    for k = 1:numel(X)  %// Iterate over all values of X
        for m = 1:N
            A(1,m) = (1/(m*pi))*sin(m*pi*X(k))*T*exp(-(m^2)*(pi^2)*T);
            %// array terms of partial sum
        end
        M = -sum(A); % evaluate Nth partial sum
        U(k) = T*(1-X(k)) + M; % output U(X,T) = T(1-X) + V(X,T)
    end
end

The output of this function has the same dimensions as X .

By the way, did you verify that Psum produces that correct result for scalar inputs?

I don't fully understand what you are trying to accomplish, but just an observation for you: if your input X is a vector, line 3 can not be computed correctly

A(1,m) = (1/(m*pi))*sin(m*pi*X)*T*exp(-(m^2)*(pi^2)*T);

because the right hand side of the equation give you a vector, but the right hand side A(1,m) is one element, not vector. so you have dimension mismatch. Hope this helps!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM