powerTransformations.frink

View or download powerTransformations.frink in plain text format


use LambertW.frink

/** 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]

   // Solve generalizations of a = n / ln[n] for n which include
   // a = n / ln[c n]
   // This requires the Lambert W function which is not yet part of core
   // Frink but is defined in LambertW.frink which has dependencies on
   // ArbitraryPrecision.frink and sqrtWayne.frink.
   solve[_n / ln[(_c:1) _n] === _a, _n] :: freeOf[_c, _n] <-> [ solve[_n === e^(-LambertW[-1 / (_a _c)]/_c), _n], solve[_n === e^(-LambertW1[-1 / (_a _c)]/_c), _n] ]

   // Solve generalizations of z = w e^w  for w which include
   // z = w e^(d w)
   // This requires the Lambert W function which is not yet part of core
   // Frink but is defined in LambertW.frink which has dependencies on
   // ArbitraryPrecision.frink and sqrtWayne.frink.
   solve[_w e^((_d:1) _w) === _z, _w] :: freeOf[_d, _w] <-> solve[_w === LambertW[_d _z] / _d, _w]
}


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 18289 days, 1 hours, 38 minutes ago.