integrals.frink

View or download integrals.frink in plain text format


// This file contains transformation rules suitable for finding
// integrals of expressions.
//
// At the moment, this is just a proof of concept.  Further development
// will probably use the very nice set of rules derived by Albert D. Rich
// for computer-based evaluation of integrals:
//
// http://www.apmaths.uwo.ca/~arich/index.html
//
// It appears possible to use his machine-readable rules written for
// Mathematica and transform them automatically into Frink (some mathematical
// functions will of course need to be added.)
//
// Perhaps a better method will involve Risch integration which is very
// complex to implement but provides a decision procedure which can decide
// if an expression *can* be integrated.
//
transformations integrals
{
   // Multiple integrals
   // Bail-out condition for first integral
   Integrate[_n, _x, 1] <-> Integrate[_n, _x]

   // Otherwise take one integral and decrement.
   Integrate[_n, _x, _times is isInteger] <-> Integrate[Integrate[_n,_x], _x, _times-1]
   
   // Integrate both sides of an equation.
   Integrate[_a === _b, _x]   <->  Integrate[_a, _x] === Integrate[_b, _x]
   
   // Expression entirely free of x
   Integrate[_a, _x] :: freeOf[_a, _x] <-> _a _x

   // Separate out multiplicative parts that are free of x
   Integrate[_a _b, _x] :: freeOf[_a, _x] and expressionContains[_b, _x] <-> _a Integrate[_b, _x]

   // Chain rules for sums
   Integrate[_a + _b, _x]  <->  Integrate[_a, _x] + Integrate[_b, _x]

   // Powers of x
   Integrate[_x^(_y:1), _x] :: _y != -1 <-> _x^(_y+1)/(_y+1)

   // Special case of 1/x  (also written as x^-1)
   Integrate[_x^-1, _x] <-> ln[_x]

   // b^(a x)
   Integrate[_b^((_a:1) _x), _x] :: freeOf[_b,_x] and freeOf[_a, _x] <-> _b^(_a _x) / (_a ln[_b])

   // ln[x]
   Integrate[ln[_x], _x]  <->  _x ln[_x] - _x

   // Trigonometric functions
   Integrate[sin[(_a:1) _x], _x] :: freeOf[_a,_x]  <-> -1/_a cos[_a _x]
   Integrate[cos[(_a:1) _x], _x] :: freeOf[_a,_x]  <->  1/_a sin[_a _x]
   Integrate[tan[(_a:1) _x], _x] :: freeOf[_a,_x]  <->  -1/_a ln[cos[_a _x]]

   // Definite integral.
   // This is inefficient because it has to integrate the same expression twice.
   // We need a way to define a variable and use that twice.  And the
   // substituteExpression is awkward, as it's not evaluated until an eval is
   // called on the expression..  We need an operator form that is
   // replaced at transformation time.
   Integrate[_n, _x, _fromX, _toX] <-> substituteExpression[Integrate[_n, _x], _x, _toX] - substituteExpression[Integrate[_n, _x], _x, _fromX]

   // Multiple definite integral
   // Otherwise take one integral and decrement.
   Integrate[_n, _x, _times is isInteger, _fromX, _toX] <-> substituteExpression[Integrate[_n, _x, _times], _x, _toX] - substituteExpression[Integrate[_n, _x, _times], _x, _fromX]
}


View or download integrals.frink in plain text format


This is a program written in the programming language Frink.
For more information, view the Frink Documentation or see More Sample Frink Programs.

Alan Eliasen was born 17649 days, 5 hours, 44 minutes ago.