Take the 2-minute tour ×
Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. It's 100% free, no registration required.

I try to integrate a function and plot it in Octave. Integration itself works, i.e. I can evaluate the function g like g(1.5) but plotting fails.

f = @(x) ( (1) .* and((0 < x),(x <= 1)) + (-1) .* and((1 <x),(x<=2)));
g = @(x) (quadcc(f,0,x));

x = -1.0:0.01:3.0;
plot(x,g(x));

But receive the following error:

quadcc: upper limit of integration (B) must be a single real scalar

As far as I can tell this is because the plot passes a vector (namely x) to g which passes it down to quadcc which cannot handle vector arguments for the third argument.

So I understand what's the reason for the error but have no clue how to get the desired result instead.

N.B. This is just a simplified version of the real function I use, but the real function is also constant on a finite set of intervals ( number of intervals is less than ten if that matters). I need to integrate the real function 3 times in succession (f represents a jerk and I need to determine functions for acceleration, velocity and distance). So I cannot compute the integrals by hand like I could in this simple case.

share|improve this question

2 Answers 2

up vote 0 down vote accepted

As you observed, Octave integration routines only take scalars as lower and upper integration boundaries. So you cannot pass the vector x = -1.0:.01:3.0 as an argument.

Possible solutions:

Use a for loop, e.g. y = x; for j = 1:length(x) y(j) = g(x(j)); end; plot(x,y)

... which will waste a lot of cycles ... ... or ...

Use a low end integration routine such as the midpoint rule (you're plotting the results, right? Why use quadcc?) and write your own quadrature routine that accepts vector arguments.

share|improve this answer
    
it's been so long since I asked this question, I don't remember the use case any more ;-). The only thing I remember is that I switched from Octave to C#... Thanks anyway for your effort. –  Onur Jun 18 at 13:17

You could use cumtrapz instead of quadcc.

share|improve this answer
    
How would you rewrite the function g? g = @(x) (quadcc( 0:0.1:x, f(0:0.1:x))); doesn't work. The plot results in an error ` plt2vv: vector lengths must match`. –  Onur Nov 21 '12 at 8:34

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.