1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
/* Original version of this file copyright 1999 by Michael Wester,
* and retrieved from http://www.math.unm.edu/~wester/demos/ComplexDomain/problems.macsyma
* circa 2006-10-23.
*
* Released under the terms of the GNU General Public License, version 2,
* per message dated 2007-06-03 from Michael Wester to Robert Dodier
* (contained in the file wester-gpl-permission-message.txt).
*
* See: "A Critique of the Mathematical Abilities of CA Systems"
* by Michael Wester, pp 25--60 in
* "Computer Algebra Systems: A Practical Guide", edited by Michael J. Wester
* and published by John Wiley and Sons, Chichester, United Kingdom, 1999.
*/
/* ----------[ M a c s y m a ]---------- */
/* ---------- Initialization ---------- */
showtime: all$
prederror: false$
/* ---------- The Complex Domain ---------- */
/* Complex functions---separate into their real and imaginary parts.
Here, variables default to REAL.
[Re(x + i y), Im(x + i y)] => [Re(x) - Im(y), Im(x) + Re(y)]
for x and y complex */
[realpart(x + %i*y), imagpart(x + %i*y)];
declare([x, y], complex)$
[realpart(x + %i*y), imagpart(x + %i*y)];
remove([x, y], complex)$
/* => 1 [W. Kahan] */
abs(3 - sqrt(7) + %i*sqrt(6*sqrt(7) - 15));
ratsimp(%);
/* => 1/sqrt(a^2 + (1/a + b)^2) for real a, b */
abs(1/(a + %i/a + %i*b));
/* => log 5 + i arctan(4/3) */
rectform(log(3 + 4*%i));
/* => [sin(x) cos(x) + i sinh(y) cosh(y)] / [cos(x)^2 + sinh(y)^2] */
rectform(tan(x + %i*y));
/* Check for branch abuse. See David R. Stoutemyer, ``Crimes and Misdemeanors
in the Computer Algebra Trade'', _Notices of the American Mathematical
Society_, Volume 38, Number 7, September 1991, 778--785. This first
expression can simplify to sqrt(x y)/sqrt(x), but no further in general
(consider what happens when x, y = -1). sqrt(x y) = sqrt(x) sqrt(y) if
either x >= 0 or y >= 0 or both x and y lie in the right-half plane
(Re x, Re y > 0) [considering principal values]. */
expr: sqrt(x*y*abs(z)^2) / (sqrt(x)*abs(z));
ratsimp(%);
declare([x, y, z], complex)$
ratsimp(expr);
remove(y, complex)$
/* Special case: sqrt(x y |z|^2)/(sqrt(x) |z|) => sqrt(y) [PV] for y >= 0 */
assume(y >= 0)$
sqrt(x*y*abs(z)^2) / (sqrt(x)*abs(z));
forget(y >= 0)$
remove([x, z], complex)$
/* sqrt(1/z) = 1/sqrt(z) except when z is real and negative, in which case
sqrt(1/z) = - 1/sqrt(z) [considering principal values] */
expr: sqrt(1/z) - 1/sqrt(z);
ratsimp(%);
declare(z, complex)$
ratsimp(expr);
remove(z, complex)$
/* Special case: sqrt(1/z) - 1/sqrt(z) => 0 [PV] for z > 0 */
assume(z > 0)$
ratsimp(expr);
forget(z > 0)$
/* Special case: sqrt(1/z) + 1/sqrt(z) => 0 [PV] for z < 0 */
assume(z < 0)$
sqrt(1/z) + 1/sqrt(z);
forget(z < 0)$
/* sqrt(e^z) = e^(z/2) if and only if Im z is contained in the interval
((4 n - 1) pi, (4 n + 1) pi] for n an integer: ..., (-5 pi, -3 pi],
(-pi, pi], (3 pi, 5 pi], ...; otherwise, sqrt(e^z) = - e^(z/2) [considering
principal values] */
declare(z, complex)$
sqrt(%e^z) - %e^(z/2);
ratsimp(%);
remove(z, complex)$
/* Special case: sqrt(e^z) - e^(z/2) => 0 [PV] for z real */
sqrt(%e^z) - %e^(z/2);
/* The principal value of this expression is - e^(3 i) = - cos 3 - i sin 3 */
sqrt(%e^(6*%i));
bfloat(%);
/* log(e^z) = z if and only if Im z is contained in the interval (-pi, pi]
[considering principal values] */
declare(z, complex)$
log(%e^z);
remove(z, complex)$
/* Special case: log(e^z) => z [PV] for z real */
log(%e^z);
/* The principal value of this expression is (10 - 4 pi) i */
log(%e^(10*%i));
/* (x y)^n = x^n y^n if either x > 0 or y > 0 or both x and y lie in the
right-half plane (Re x, Re y > 0) or n is an integer [considering principal
values] */
expr: (x*y)^(1/n) - x^(1/n)*y^(1/n);
ratsimp(%);
declare([x, y], complex)$
ratsimp(expr);
remove(y, complex)$
/* Special case: (x y)^(1/n) - x^(1/n) y^(1/n) => 0 [PV] for y > 0 */
assume(y > 0)$
ratsimp(expr);
forget(y > 0)$
/* Special case: (x y)^n - x^n y^n => 0 [PV] for integer n */
declare(y, complex, n, integer)$
(x*y)^n - x^n*y^n;
remove([x, y], complex, n, integer)$
/* arctan(tan(z)) = z for z real if and only if z is contained in the interval
(-pi/2, pi/2] [considering principal values] */
expr: atan(tan(z));
ratsimp(%);
declare(z, complex)$
ratsimp(expr);
remove(z, complex)$
/* Special case: arctan(tan(z)) => z [PV] for -pi/2 < z < pi/2 */
assume(-%pi/2 < z, z < %pi/2)$
ratsimp(expr);
forget(-%pi/2 < z, z < %pi/2)$
ev(expr, triginverses: all);
remvalue(expr)$
/* The principal value of this expression is 10 - 3 pi */
atan(tan(10));
/* The principal value of this expression is 11 - 4 pi + 30 i = -1.56637 + 30 i
*/
atan(tan(11 + 30*%i));
atan(tan(11.0 + 30.0*%i));
sfloat(%);
/* This is a challenge problem proposed by W. Kahan: simplify the following
expression for complex z. Expanding out the expression produces
(z^2 + 1)/(2 z) +- (z + 1)*(z - 1)/(2 z) => z or 1/z in each of its branches
*/
declare(z, complex)$
w: (z + 1/z)/2;
expr: w + sqrt(w + 1)*sqrt(w - 1);
ratsimp(expr);
radcan(expr);
remvalue(w, expr)$
remove(z, complex)$
|