home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Meeting Pearls 3
/
Meeting_Pearls_III.iso
/
Pearls
/
texmf
/
inputs
/
latex
/
contrib
/
other
/
fp.lha
/
fp
/
fp-eqn.sty
< prev
next >
Wrap
Text File
|
1995-04-03
|
11KB
|
383 lines
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{fp-eqn}[1995/04/03]
%version information
\def\FP@eqnversion{0.4}
\message{%
`Fixed Point Equation Solver',%
\space\space\space%
Version \FP@eqnversion\space%
\space(C) Michael Mehlich%
\space\space\space\space\space\space\space%
\space\space\space\space\space\space\space%
}
%resolve dependencies
\RequirePackage{fp}
%%%public area (macros which may be used)%%%
\def\FPlsolve#1#2#3{\FP@lsolve#1{#2}{#3}} % #1 := x with #2*x+#3=0
\def\FPqsolve#1#2#3#4#5{\FP@qsolve#1#2{#3}{#4}{#5}} % #1,#2 := x with #3*x^2+#4*x+#5 = 0
\def\FPcsolve#1#2#3#4#5#6#7{\FP@csolve#1#2#3{#4}{#5}{#6}{#7}}
% #1,#2,#3 := x with #4*x^3+#5*x^2+#6*x+#7 = 0
\def\FPqqsolve#1#2#3#4#5#6#7#8#9{\FP@qqsolve#1#2#3#4{#5}{#6}{#7}{#8}{#9}}
% #1,#2,#3,#4 := x with #5*x^4+#6*x^3+#7*x^2+#8*x+#9 = 0
%%%private fp-area (don't use these macros)%%%
%compute the solution of a*x + b = 0
\def\FP@lsolve@warn#1{%
%value determining warning
\FPifzero{#1}%
\FP@warnmessage{Linear equation has infinitely many solutions, choosing 0}%
\edef\FP@tmp{0}%
\else%
\FP@errmessage{Linear equation does not have a solution}%
\fi%
}
\def\FP@@lsolve#1#2{%
\FPdiv\FP@tmp{#2}{#1}%
\FPneg\FP@tmp\FP@tmp%
}
\def\FP@lsolve#1#2#3{%
% #1 macro, which gets the result
% #2 value a
% #3 value b
%
\FP@beginmessage{LSOLVE}%
%
{\def\FP@beginmessage##1{}%
\def\FP@endmessage##1{}%
%
\FPifzero{#2}%
\FP@lsolve@warn{#3}%
\else%
\FP@@lsolve{#2}{#3}%
\fi%
%
\global\let\FP@tmp\FP@tmp%
}%
%
\let#1\FP@tmp%
%
\FP@endmessage{}%
}
%compute the solutions of a*x^2 + b*x + c = 0
\def\FP@@qsolve#1#2#3{%
% \FP@tmpc := 2*a
\FPadd\FP@tmpc{#1}{#1}%
%
% \FP@tmpb := b*b
\FPmul\FP@tmpd{#2}{#2}%
%
% \FP@tmpc := 4*a*c
\FPmul\FP@tmpe\FP@tmpc{#3}%
\FPadd\FP@tmpe\FP@tmpe\FP@tmpe%
%
% \FP@tmpf := b^2 - 4*a*c
\FPsub\FP@tmpf\FP@tmpd\FP@tmpe%
%
\FPifneg\FP@tmpf%
\FP@errmessage{Quadratic equation does not have a solution}%
\else%
% \FP@tmpd := sqrt(b^2 - 4*a*c)
\FProot\FP@tmpd\FP@tmpf{2}%
%
% solution 1: x = (-b + sqrt(b^2 - 4*a*c))/(2*a)
\FPsub\FP@tmp\FP@tmpd{#2}%
\FPdiv\FP@tmpe\FP@tmp\FP@tmpc%
%
% solution 2: x = (-b + sqrt(b^2 - 4*a*c))/(2*a)
\FPadd\FP@tmp\FP@tmpd{#2}%
\FPdiv\FP@tmpd\FP@tmp\FP@tmpc%
\FPneg\FP@tmpd\FP@tmpd%
\fi%
}
\def\FP@qsolve#1#2#3#4#5{%
% #1 macro, which gets the 1st result
% #2 macro, which gets the 2nd result
% #3 value a
% #4 value b
% #5 value c
%
\FP@beginmessage{QSOLVE}%
%
{\def\FP@beginmessage##1{}%
\def\FP@endmessage##1{}%
%
\FPifzero{#3}%
\FP@warnmessage{Quadratic equation is linear}%
\FP@lsolve\FP@tmpe{#4}{#5}%
\let\FP@tmpd\FP@tmpe%
\else%
\FP@@qsolve{#3}{#4}{#5}%
\fi%
%
\global\let\FP@tmpa\FP@tmpe%
\global\let\FP@tmpb\FP@tmpd%
}%
%
\let#1\FP@tmpa%
\let#2\FP@tmpb%
%
\FP@endmessage{}%
}
%compute the solutions of a*x^3 + b*x^2 + c*x + d = 0
\def\FP@@csolve#1#2#3#4{%
%reducation of cubic equation
%\FPeval\FP@tmpp{(#3)/(3*(#1)) - mul(copy((#2)/(3*(#1))))}%
\FPupn\FP@tmpp{#3 3 #1 mul div #2 3 #1 mul div copy mul sub}%
%\FPeval\FP@tmpq{mul(mul(copy(copy((#2)/(3*(#1)))))) - (#2)*(#3)/(6*(#1)*(#1)) + (#4)/(2*(#1))}%
\FPupn\FP@tmpq{#2 3 #1 mul div copy copy mul mul #2 #3 mul 6 #1 mul #1 mul div sub #4 2 #1 mul div add}%
%
%check whether solution is trivial
\FPifzero\FP@tmpp%
%\FPeval\FP@tmpf{root(3,abs(2*\FP@tmpq)) * sgn(\FP@tmpq)}%
\FPupn\FP@tmpf{3 2 \FP@tmpq{} mul abs root \FP@tmpq{} sgn mul}%
\let\FP@tmpe\FP@tmpf%
\let\FP@tmpd\FP@tmpf%
\else%
%compute D
%\FPeval\FP@tmpD{mul(copy(\FP@tmpq)) + mul(mul(copy(copy(\FP@tmpp))))}%
\FPupn\FP@tmpD{\FP@tmpq{} copy mul \FP@tmpp{} copy copy mul mul add}%
\FPsgn\FP@tmp\FP@tmpD%
\expandafter\ifnum\FP@tmp=1\relax%
%only one real valued solution, compute it
\FProot\FP@tmpD\FP@tmpD{2}%
\FPsub\FP@tmpf\FP@tmpD\FP@tmpq%
\FPadd\FP@tmpe\FP@tmpD\FP@tmpq%
\FPneg\FP@tmpe\FP@tmpe%
%\FPeval\FP@tmpf{root(3,abs(\FP@tmpf)) * sgn(\FP@tmpf) + root(3,abs(\FP@tmpe)) * sgn(\FP@tmpe)}%
\FPupn\FP@tmpf{3 \FP@tmpf{} abs root \FP@tmpf{} sgn mul 3 \FP@tmpe{} abs root \FP@tmpe{} sgn mul add}%
\FP@warnmessage{Cubic equation has only one real valued solution}%
\let\FP@tmpe\FP@tmpf%
\let\FP@tmpd\FP@tmpf%
\else%
%compute r and phi/3
%\FPeval\FP@tmpr{root(2,abs(\FP@tmpp)) * sgn(\FP@tmpq) * 2}%
\FPupn\FP@tmpr{2 \FP@tmpp{} abs root \FP@tmpq{} sgn mul}%
%\FPeval\FP@tmpp{arccos(\FP@tmpq/\FP@tmpr/\FP@tmpr/\FP@tmpr)/3}%
\FPupn\FP@tmpp{\FP@tmpq{} \FP@tmpr{} div \FP@tmpr{} div \FP@tmpr{} div arccos 3 div}%
%compute the three solutions
\FPmul\FP@tmpr{2}\FP@tmpr%
\FPeval\FP@tmpf{neg(\FP@tmpr) * cos(\FP@tmpp)}%
\FPeval\FP@tmpe{(\FP@tmpr) * cos(1.047197551196597746-(\FP@tmpp))}%
\FPeval\FP@tmpd{(\FP@tmpr) * cos(1.047197551196597746+(\FP@tmpp))}%
\fi%
\fi%
%
\FPeval\FP@tmpf{(\FP@tmpf)-(#2)/(3*(#1))}%
\FPeval\FP@tmpe{(\FP@tmpe)-(#2)/(3*(#1))}%
\FPeval\FP@tmpd{(\FP@tmpd)-(#2)/(3*(#1))}%
}
\def\FP@csolve#1#2#3#4#5#6#7{%
% #1 macro, which gets the 1st result
% #2 macro, which gets the 2nd result
% #3 macro, which gets the 3nd result
% #4 value a
% #5 value b
% #6 value c
% #7 value d
%
\FP@beginmessage{CSOLVE}%
%
{\def\FP@beginmessage##1{}%
\def\FP@endmessage##1{}%
%
\FPifzero{#4}%
\FP@warnmessage{Cubic equation is quadratic}%
\FP@qsolve\FP@tmpe\FP@tmpf{#5}{#6}{#7}%
\let\FP@tmpd\FP@tmpe%
\else%
\FP@@csolve{#4}{#5}{#6}{#7}%
\fi%
%
\global\let\FP@tmpa\FP@tmpf%
\global\let\FP@tmpb\FP@tmpe%
\global\let\FP@tmpc\FP@tmpd%
}
%
\let#1\FP@tmpa%
\let#2\FP@tmpb%
\let#3\FP@tmpc%
%
\FP@endmessage{}%
}
%compute the solutions of a*x^4 + b*x^3 + c*x^2 + d*x + e = 0
\def\FP@qqsolveAy#1#2#3{%
\FPeval\FP@tmpA{8*(\FP@tmpyc)+((#2)*(#2)/(#1)-4*(#3))/(#1)}%
\FPsgn\FP@tmp\FP@tmpA%
\expandafter\ifnum\FP@tmp>0\relax%
\let\FP@tmpy\FP@tmpyc%
\else%
\FPeval\FP@tmpA{8*(\FP@tmpyb)+((#2)*(#2)/(#1)-4*(#3))/(#1)}%
\FPsgn\FP@tmp\FP@tmpA%
\expandafter\ifnum\FP@tmp>0\relax%
\let\FP@tmpy\FP@tmpyb%
\else%
\FPeval\FP@tmpA{8*(\FP@tmpya)+((#2)*(#2)/(#1)-4*(#3))/(#1)}%
\FPsgn\FP@tmp\FP@tmpA%
\expandafter\ifnum\FP@tmp>0\relax%
\let\FP@tmpy\FP@tmpya%
\else%
\FP@errmessage{Equation of 4-th degree has no solution}%
\fi%
\fi%
\fi%
\FProot\FP@tmpA\FP@tmpA{2}%
}
\def\FP@@qqsolve#1#2#3#4#5{%
%compute cubic equation
\FPeval\FP@tmpyb{neg(4*(#3)/(#1))}%
\FPeval\FP@tmpyc{2*(#2)*(#4)/(#1)/(#1) - 8*(#5)/(#1)}%
\FPeval\FP@tmpyd{(#5)/(#1)*(4*(#3)/(#1) - (#2)*(#2)/(#1)/(#1)) - (#4)*(#4)/(#1)/(#1)}%
%solve cubic equation
\FP@@csolve{8}\FP@tmpyb\FP@tmpyc\FP@tmpyd%
%hold an arbitrary solution
\let\FP@tmpya\FP@tmpd%
\let\FP@tmpyb\FP@tmpe%
\let\FP@tmpyc\FP@tmpf%
%compute A and y from these solutions
\FP@qqsolveAy{#1}{#2}{#3}%
%compute first quadratic equation
\FPeval\FP@tmpp{((#2)/(#1)+(\FP@tmpA))/2}%
\FPeval\FP@tmpq{(\FP@tmpy)+((#2)*(\FP@tmpy)-(#4))/(#1)/(\FP@tmpA)}%
\FP@qsolve\FP@tmpg\FP@tmpf{1}\FP@tmpp\FP@tmpq%
%compute second quadratic equation
\FPeval\FP@tmpp{((#2)/(#1)-(\FP@tmpA))/2}%
\FPeval\FP@tmpq{(\FP@tmpy)-((#2)*(\FP@tmpy)-(#4))/(#1)/(\FP@tmpA)}%
\FP@qsolve\FP@tmpe\FP@tmpd{1}\FP@tmpp\FP@tmpq%
}
%subsolve a*x^4 + c*x^2 + e = 0
\def\FP@qsolve@zero#1#2#3{%
\FPeval\FP@tmpy{(#2)*(#2) - 4*(#1)*(#3)}%
\FPsgn\FP@tmp\FP@tmpy%
\expandafter\ifnum\FP@tmp<0\relax%
\FP@errmessage{Equation of 4-th degree has no solution}%
\else%
%compute solutions
\FPeval\FP@tmpya{neg(root(2,\FP@tmpy)+(#2))/(2*(#1))}%
\FPeval\FP@tmpyb{(root(2,\FP@tmpy)-(#2))/(2*(#1))}%
\FPsgn\FP@tmpf\FP@tmpya%
\FPsgn\FP@tmpg\FP@tmpyb%
\ifnum\expandafter\ifnum\FP@tmpf<0 0\else1\fi\expandafter\ifnum\FP@tmpg<0 0\else1\fi=0\relax%
\FP@errmessage{Equation of 4-th degree has no solution}%
\else%
\expandafter\ifnum\FP@tmpf<0\relax%
\FP@warnmessage{Equation of 4-th degree only has two solutions}%
\let\FP@tmpya\FP@tmpyb%
\else%
\expandafter\ifnum\FP@tmpg<0\relax%
\FP@warnmessage{Equation of 4-th degree only has two solutions}%
\let\FP@tmpyb\FP@tmpya%
\fi%
\fi%
%compute solutions
\FProot\FP@tmpg\FP@tmpya{2}%
\FPneg\FP@tmpf\FP@tmpg%
\FProot\FP@tmpe\FP@tmpyb{2}%
\FPneg\FP@tmpd\FP@tmpe%
\fi%
\fi%
}
%subsolve a*x^4 + b*x^3 + c*x^2 + b*x + a = 0
\def\FP@qsolve@eq#1#2#3{%
\FPeval\FP@tmpy{(#2)*(#2) - 4*(#1)*(#3) + 8*(#1)*(#1)}%
\FPsgn\FP@tmp\FP@tmpy%
\expandafter\ifnum\FP@tmp<0\relax%
\FP@errmessage{Equation of 4-th degree has no solution}%
\else%
%compute solutions
\FPeval\FP@tmpya{neg(root(2,\FP@tmpy)+(#2))/(2*(#1))}%
\FPeval\FP@tmpyb{(root(2,\FP@tmpy)-(#2))/(2*(#1))}%
\FPeval\FP@tmpyc{(\FP@tmpya)*(\FP@tmpya)-4}%
\FPeval\FP@tmpyd{(\FP@tmpyb)*(\FP@tmpyb)-4}%
\FPsgn\FP@tmpf\FP@tmpyc%
\FPsgn\FP@tmpg\FP@tmpyd%
\ifnum\expandafter\ifnum\FP@tmpf<0 0\else1\fi\expandafter\ifnum\FP@tmpg<0 0\else1\fi=0\relax%
\FP@errmessage{Equation of 4-th degree has no solution}%
\else%
\expandafter\ifnum\FP@tmpf<0\relax%
\FP@warnmessage{Equation of 4-th degree only has two solutions}%
\let\FP@tmpya\FP@tmpyb%
\let\FP@tmpyc\FP@tmpyd%
\else%
\expandafter\ifnum\FP@tmpg<0\relax%
\FP@warnmessage{Equation of 4-th degree only has two solutions}%
\let\FP@tmpyb\FP@tmpya%
\let\FP@tmpyd\FP@tmpyc%
\fi%
\fi%
%compute solutions
\FPeval\FP@tmpg{((\FP@tmpya)+root(2,(\FP@tmpyc)))/2}%
\FPeval\FP@tmpf{((\FP@tmpya)-root(2,(\FP@tmpyc)))/2}%
\FPeval\FP@tmpe{((\FP@tmpyb)+root(2,(\FP@tmpyd)))/2}%
\FPeval\FP@tmpd{((\FP@tmpyb)-root(2,(\FP@tmpyd)))/2}%
\fi%
\fi%
}
%complete solve of equation of 4-th degree
\def\FP@qqsolve#1#2#3#4#5#6#7#8#9{%
% #1 macro, which gets the 1st result
% #2 macro, which gets the 2nd result
% #3 macro, which gets the 3nd result
% #4 macro, which gets the 4th result
% #5 value a
% #6 value b
% #7 value c
% #8 value d
% #9 value e
%
\FP@beginmessage{QQSOLVE}%
%
{\def\FP@beginmessage##1{}%
\def\FP@endmessage##1{}%
%
\FPifzero{#5}%
\FP@warnmessage{Equation of 4-th degree is cubic}%
\FP@csolve\FP@tmpd\FP@tmpe\FP@tmpf{#6}{#7}{#8}{#9}%
\let\FP@tmpg\FP@tmpd%
\else%
\FPsgn\FP@tmpg{#6}%
\FPsgn\FP@tmpf{#8}%
\ifnum\expandafter\ifnum\FP@tmpg=0 0\else1\fi\expandafter\ifnum\FP@tmpf=0 0\else1\fi=0\relax%
%case b=d=0
\FP@qsolve@zero{#5}{#7}{#9}%
\else%
\FPupn\FP@tmpg{#5 #9 sub sgn}%
\FPupn\FP@tmpf{#6 #8 sub sgn}%
\ifnum\expandafter\ifnum\FP@tmpg=0 0\else1\fi\expandafter\ifnum\FP@tmpf=0 0\else1\fi=0\relax%
%case a=e, b=d
\FP@qsolve@eq{#5}{#6}{#7}%
\else%
\FP@@qqsolve{#5}{#6}{#7}{#8}{#9}%
\fi%
\fi%
\fi%
%
\global\let\FP@tmpa\FP@tmpg%
\global\let\FP@tmpb\FP@tmpf%
\global\let\FP@tmpc\FP@tmpe%
\global\let\FP@tmpd\FP@tmpd%
}%
%
\let#1\FP@tmpa%
\let#2\FP@tmpb%
\let#3\FP@tmpc%
\let#4\FP@tmpd%
%
\FP@endmessage{}%
}