powerTransformations.frink

View or download powerTransformations.frink in plain text format


/** This contains sloppy and non-rigorous solvers for equations containing
    exponents.  It is only intended for real-valued arguments and will not
    find all solutions.  It is used as a starting point only.
*/

transformations power
{
   // Solve x^y === z for y
   //   or, more generally, this solves
   // (a x)^((k y)^n) === z for y
   solve[((_a:1) _x) ^ (((_k:1) _y)^(_n:1)) === _z, _y] :: freeOf[_k, _y] && freeOf[_a, _y] && freeOf[_n, _y] && freeOf[_z, _y] <-> solve[_y === (ln[_z] / (ln[_a _x])^(1/_n)) / _k, _y]

   // Solve c a^y b^y === z for y
   solve[(_c:1) _a^_y _b^_y === _z, _y] :: freeOf[_a, _y] && freeOf[_b, _y] && freeOf[_c, _y] && freeOf[_z, _y] <-> solve[_y === ln[_z / _c] / (ln[_a] + ln[_b]), _y]

   // Solve x^y === z for x  for irrational exponents.  (Rational exponents
   // are solved better in solvingTransformations.frink )
   solve[_x ^ _y === _z, _x] :: freeOf[_z, _x] && ! isInteger[_y] && ! isRational[_y] <-> solve[_x === _z^(1/_y), _x]

   // Solve ln[a] === b  when a contains the variable y we're solving for.
   // This is only valid for the reals or complex
   // numbers where  -pi < Im[y] <= pi
   // Basically, we take the exp() of both sides.
   solve[ln[_a] === _b, _y] :: freeOf[_b, _y] and expressionContains[_a, _y] <-> solve[_a === e^_b, _y]

   // Solve log[a] === b  when a contains the variable y we're solving for.
   // Basically, we take the 10^ of both sides.
   solve[log[_a] === _b, _y] :: freeOf[_b, _y] and expressionContains[_a, _y] <-> solve[_a === 10^_b, _y]
   
   // Solve _b^_a = x  when a contains the variable y we're solving for.
   // This does not find all solutions.
   // Basically, take log of both sides to base _b.
   // The exclusiions for integer and rational arguments are because these
   // are better solved (finding more solutions) by the routines in
   // solvingTransformations.frink
   solve[_b^_a === _x, _y] :: freeOf[_x, _y] and freeOf[_b, _y] and expressionContains[_a, _y] && ! isInteger[_a] && ! isRational[_a] <-> solve[_a === ln[_x] / ln[_b], _y]

   // Solve _b^_a = x  when b contains the variable y we're solving for.
   // This does not find all solutions.
   // Basically, take log of both sides to base _b.
   // The exclusiions for integer and rational arguments are because these
   // are better solved (finding more solutions) by the routines in
   // solvingTransformations.frink
   solve[_b^_a === _x, _y] :: freeOf[_x, _y] and freeOf[_a, _y] and expressionContains[_b, _y] && ! isInteger[_a] && ! isRational[_a] <-> solve[ln[_b] === ln[_x] / _a, _y]
}


View or download powerTransformations.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 18234 days, 21 hours, 21 minutes ago.