Subsections

- Library
- Description
- Default properties
- Interfacing function
- Computational function (type 4)

##
Derivative

### Library

Linear

### Description

The Derivative block approximates the derivative of its input by computing:

### Default properties

- always active: no
- direct-feedthrough: yes
- zero-crossing: no
- mode: no
- number/sizes of inputs: 1 / -1
- number/sizes of outputs: 1 / -1
- number/sizes of activation inputs: 0 /
- number/sizes of activation outputs: 0 /
- continuous-time state: no
- discrete-time state: no
- name of computational function: deriv

### Interfacing function

`scilab/macros/scicos_blocks/linear/DERIV.sci`

### Computational function (type 4)

    #include "scicos_block.h"
    #include <math.h>

    #if WIN32
    #define NULL    0
    #endif

    void deriv(scicos_block *block,int flag)
    {
      double* rw;
      double t,dt;
      int i;
      if (flag == 4){/* the workspace is used to store previous values */
        if ((*block->work=
    	 scicos_malloc(sizeof(double)*2*(1+block->insz[0])))== NULL ) {
          set_block_error(-16);
          return;
        }
        rw=*block->work;
        t=get_scicos_time();
        rw[0]=t;
        rw[1]=t;
        for(i=0;i<block->insz[0];++i){
          rw[2+2*i]=0;
          rw[3+2*i]=0;
        }
      }else  if (flag == 5){
        scicos_free(*block->work);
      }else  if (flag == 1) {
        rw=*block->work;
        t=get_scicos_time();
        if(t>rw[1]) {
          rw[0]=rw[1];
          for(i=0;i<block->insz[0];++i)  {rw[2+2*i]=rw[3+2*i];}
        }
        rw[1]=t;
        for(i=0;i<block->insz[0];++i) {
          rw[3+2*i]=block->inptr[0][i];
        }
        dt=rw[1]-rw[0];

        if(dt!=0.0) {
          for(i=0;i<block->insz[0];++i)
    	block->outptr[0][i]=(rw[3+2*i]-rw[2+2*i])/dt;
        }
      }
    }