# Chapter 23: Calculus

This chapter covers J operators for differentiation and integration. It covers

- The conjunction `d.` which differentiates and integrates analytically, that is, it transforms expressions denoting functions into expressions denoting functions.

- The conjunction `D.` which differentiates numerically, and thus broadens the range of functions which can be differentiated. It also covers partial derivatives.

- A library script with functions for numerical integration.

## 23.1 Differentiation

There is a built-in conjunction `d.`(lowercase d dot). Its left argument is a function to be differentiated. Its right argument is `1` if the first derivative is required, or `2` for the second derivative, and so on. The first derivative of the "cube" function `^&3` is "3 times the square".

       ^&3  d. 1
    3&*@(^&2)

The general scheme is that if `e` is (an expression denoting) a function, then `e d. n` is (an expression denoting) the n'th derivative of `e`. Here is another example, expressing the cube function as the polynomial `0 0 0 1 & p.`

       0 0 0 1 &p. d. 1
    0 0 3&p.

Suppose we define a verb `cube`:

`cube =: 0 0 0 1 & p.` | `cube 2`

    0 0 0 1&p.

    8

Differentiating with `d.`, we see that the derivative is, as expected, 3-times-the-square, but the expression for the derivative is not very informative.

`(cube d. 1) 2` | `cube d. 1`

    12

    cube d.1

The reason is that `cube` is a name denoting a verb, and such names are in general not evaluated until the verb is applied. (See Appendix 1 .) If we want to inspect the derivative of `cube`, we can force evaluation of the name by applying the `f.` adverb.

`cube d. 1` | `cube f. d. 1`

    cube d.1

    0 0 3&p.

## 23.2 Integration

With a right argument of `_1`, the conjunction `d.` integrates the left argument. The integral of "3 times the square" is "cube".

       0 0 3 & p. d. _1
    0 0 0 1&p.

## 23.3 The Domain of d.

Functions which are differentiable or integrable with `d.` must firstly be scalar. That is, they must take scalar arguments and deliver scalar results, and all intermediate quantities must be scalars.

Here is an example. The function "(x-1)*(x-2)" can be written in several different ways. Here are two:

`f =: -&1 * -&2` | `g =: */ @: -& 1 2` | `f 3` | `g 3`

    -&1 * -&2

    */@:-&1 2

    2

    2

`f` is scalar, and in the domain of `d.` However, `g` is not scalar, because it forms the intermediate quantity `x -1 2` which is a vector. Thus `g` is not in the domain of `d.`. To demonstrate this, we force evaluation of the names `f` and `g` with the `f.` adverb,

`f f. d. 1` | `g f. d. 1`

    _3 2x&p.

    error

Secondly, `d.` can differentiate constant functions, polynomials, exponentials `^x` and integral powers `x^n`.

`3: d. 1` | `0 2 &p. d. 1` | `^ d. 1` | `^&4 d. 1`

    0"0

    2"0

    ^

    4&*@(^&3)

If `u` and `v` are differentiable with `d.`, then so are the forks `(u+v)`, `(u-v)`, `(u*v)` and `u%v`.

`u =: ^&3` | `v =: 0 2 & p.` | `(u + v) f. d. 1`

    ^&3

    0 2&p.

    2 0 3x&p.

Trigonometric functions are differentiable with `d.` The derivative of the fork `(sin + cos)` is `(cos - sin)`.

`sin =: 1&o.` | `cos =: 2&o.` | `(sin + cos) f. d. 1`

    1&o.

    2&o.

    2&o. + -@(1&o.)

If `u` and `v` are differentiable with `d.`, then so are the compositions `u@v` and `u@:v`

`u` | `v` | `u@v f. d. 1`

    ^&3

    0 2&p.

    2"0 * 3&*@(^&2)@(0 2&p.)

## 23.4 The Conjunction D.

The conjunction `D.` (uppercase D dot) computes derivatives. It differs from `d.` in two ways.

- By using numerical methods it can differentiate arbitrary functions, that is, it is not limited to the domain of `d.`
- It is not limited to scalar functions: it can differentiate functions with vector arguments to produce partial derivatives.

### 23.4.1 The Domain of D.

Since `D.` can use numerical methods, its arguments can be arbitrary functions. For example, recall the function `g` above, to compute "(x-1)*(x-2)",which was demonstrated above to be outside the domain of `d.` . However it is within the domain of `D.`. Its derivative is "2x-3"

`g` | `(g d. 1) 3` | `(g D. 1) 3`

    */@:-&1 2

    error

    3

### 23.4.2 Partial Derivatives with D.

Next we look at functions which compute a scalar from a vector argument. For example consider a surface where the height at a point `(x,y)` is given by

                 (sin x) * (cos y)

The height-function, with the vector argument `(x,y)` might be written:

       h =: (sin @ {.) * (cos @ {:)

The expression `(h D.1)(x,y)` computes the numerical values of the two slopes, in the x-direction and the y-direction, of the function `h` at the point `(x,y)`.

`x=: 0.4` | `y =: 0.5` | `p =: h D. 1 x,y`

    0.4

    0.5

    0.8083071 _0.1866971

The result `p` gives the values of the partial derivatives with respect to `x` and with respect to `y`.

We can check this result. Suppose we define a function `q` say, for the height along the line `y=0.5`. We want `q(x)` to be `h(x,0.5)` and thus

       q =: h @: (, & 0.5)

The idea now is that the derivative of `q` applied to argument `x` should be the same as the first partial derivative of `h` at `x,0.5`.

`h D.1 x,y` | `q D. 1 x`

    0.8083071 _0.1866971

    0.8083071

Now we look at partial derivatives of functions which compute vectors from vectors. Here is an example, a function which takes the point (`x,y,z)` in 3-space to the point `(2x,3y)` in 2-space.

`foo =: (2 3 & *) @: (1 1 0 & #)` | `foo 1 1 1`

    2 3&*@:(1 1 0&#)

    2 3

In general such a function will take an argument-vector of length `m` and produce a result-vector of length `n`. Hence there will be `m*n` partial derivatives, one for each element of the result with respect to each element of the argument. The six partial derivatives of `foo` at the point `xyz = 1 1 1` are shown by:

`pd =: foo D. 1` | `pd 1 1 1`

    foo D.1

    2 0
    0 3
    0 0

Consider now a function such as `cube` which produces scalars from scalars. Given a vector argument, it will produce a vector result of the same length, where an element of the result depends only on the corresponding element of the argument.

`cube` | `cube a =: 1 2 3`

    0 0 0 1&p.

    1 8 27

Therefore, for a scalar function, all partial derivatives are zero except those for elements of the result with respect to the corresponding elements of the argument.

`pd =: cube D. 1` | `pd 2 3 4`

    cube D.1

    12  0  0
     0 27  0
     0  0 48

If a scalar function is given in fully-evaluated form, and is in the domain of `d.`, the `D.` conjunction will produce an analytic expression for the partial derivatives function:

`PD =: (0 0 0 1 & p.) D.1` | `PD 2 3 4`

    (* =/~@(i.@$))@:(0 0 3&p.)

    12  0  0
     0 27  0
     0  0 48

## 23.5 Numerical Integration

There is a library script containing several different operators for integration. Documentation is given in the script file. Supposing that J installed in directory `jdir`, then this script can be loaded by:

       load jdir,'/system/packages/math/integrat.ijs'

One of these operators is the conjunction `adapt` ("numeric integration by adaptive quadrature"). The expression `f adapt (L,U)` computes the numeric value of the definite integral of `f` between limits `L` and `U`. For example, we expect the integral of `3&*` between `0` and `1` to be `1.5`

`f =: 3&*` | `f adapt 0 1`

    3&*

    1.5

This is the end of Chapter 23.

NEXT
Table of Contents
Index

Copyright © Roger Stokes 2003. This material may be freely reproduced, provided that this copyright notice is also reproduced.

last updated 8 Sep 2003