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 17592 days, 15 hours, 40 minutes ago.