Hello,<br><br>I have developed a bit of code for calculating linear 
least squares regression.  I call it GLLSR - general linear least 
squares regression.  It can fit lines, polynomials of arbitrary order 
and any function which can be linearized via a transformation.  It 
basically does all the fitting that excel can do.  <br>
<br>The document below illustrates a set of examples.<br><br>%% This program is free software; you can redistribute it and/or<br>%% modify it under the terms of the GNU General Public License<br>%% as published by the Free Software Foundation; either version 2<br>

%% of the License, or (at your option) any later version.<br>%% <br>%% This program is distributed in the hope that it will be useful,<br>%% but WITHOUT ANY WARRANTY; without even the implied warranty of<br>%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br>

%% GNU General Public License for more details.<br><br>\documentclass{article}<br><br>\usepackage{pst-all}<br>\usepackage{pst-func}<br>\usepackage{pstricks-add}<br>\usepackage{filecontents}<br>%Exp(3*e^2x)<br>\begin{filecontents}{exp.dat}<br>

1 22<br>2 164<br>3 1210<br>4 8943<br>\end{filecontents}<br>%Recip(100/x)<br>\begin{filecontents}{recip.dat}<br><div id=":17l">1 100<br>2 50<br>3 33<br>4 25<br>5 20<br>6 12.5<br>\end{filecontents}<br>%Poly(-7.26*x^4+57.4*x^3-142.94*x^2+294.53*x-109)<br>

\begin{filecontents}{poly.dat}<br>1 93<br>2 251<br>3 450<br>4 597<br>5 428<br>6 -498<br>\end{filecontents}<br>%Log(5+20*log(x))<br>\begin{filecontents}{logt.dat}<br>2 11<br>3 14.5<br>4 17<br>5 19<br>6 20.5<br>\end{filecontents}<br>

%Log(5+20*ln(x))<br>\begin{filecontents}{loge.dat}<br>2 19<br>3 27<br>4 33<br>5 37<br>6 41<br>\end{filecontents}<br>%Power(x^3)<br>\begin{filecontents}{power.dat}<br>2 8<br>3 27<br>4 64<br>5 125<br>6 216<br>7 343<br>8 512<br>

9 729<br>10 1000<br>\end{filecontents}<br>%Gauss (e^(-x^2))<br>\begin{filecontents}{gauss.dat}<br>-10 3.72008E-44<br>-8 1.60381E-28<br>-6 2.31952E-16<br>-4 1.12535E-07<br>-2 0.018315639<br>2 0.018315639<br>4 1.12535E-07<br>

6 2.31952E-16<br>8 1.60381E-28<br>10 3.72008E-44<br>\end{filecontents}<br>%Linear (2x+2)<br>\begin{filecontents}{linear.dat}<br>1 4<br>2 6<br>3 8<br>4 10<br>5 12<br>6 14<br>7 16<br>8 18<br>9 20<br>10 22<br>\end{filecontents}<br>

%Linear (2x 3x)<br>\begin{filecontents}{linearA.dat}<br>1 2 3<br>2 4 6<br>3 6 9<br>4 8 12<br>5 10 15<br>6 12 18<br>7 14 21<br>8 16 24<br>9 18 27<br>10 20 30<br>\end{filecontents}<br>%King (sqrt(5+4*V^0.5))<br>\begin{filecontents}{king.dat}<br>

2 3.264483765<br>3 3.453723097<br>4 <a href="tel:3.605551275" value="+13605551275" target="_blank">3.605551275</a><br>5 3.734202982<br>6 3.846811533<br>7 3.947531538<br>8 <a href="tel:4.039023211" value="+14039023211" target="_blank">4.039023211</a><br>
9 <a href="tel:4.123105626" value="+14123105626" target="_blank">4.123105626</a><br>10 4.20108446<br>\end{filecontents}<br><br>\makeatletter<br>%New PlotStyle ErrorLine<br>
%%%%%%%%%%%<br>\def\beginplot@ErrorLine{\begin@OpenObj}<br>\def\endplot@ErrorLine{\psErrorLine@ii}<br>\def\psErrorLine@ii{%<br>  \addto@pscode{<br>    \pst@cp     % current point<br>    \psline@iii % arc and lineto type<br>

    \tx@ErrorLine    <br>  }%<br>  \end@OpenObj%<br>}<br>%<br>\def\tx@ErrorLine{ErrorLine }<br>\pst@def{ErrorLine}<{<br>  /copypt { dup 3 2 roll dup 4 1 roll exch } def %copy point<br>  NArray n 0 eq not   <br>    { n { \psk@relyerr\space 0 eq not <br>

    {copypt copypt dup \psk@relyerr\space mul add ArrowA<br>    dup \psk@relyerr\space mul sub <br>    Lineto <br>    copypt dup \psk@relyerr\space mul sub ArrowB L} if<br>    \psk@relxerr\space 0 eq not   <br>    {copypt copypt exch dup \psk@relxerr\space mul add exch ArrowA<br>

    exch dup \psk@relxerr\space mul sub exch<br>    Lineto <br>    copypt exch dup \psk@relxerr\space mul sub exch ArrowB L pop pop }<br>    { pop pop } ifelse } repeat <br>    } if <br>}><br><br>\define@boolkey[psset]{pstricks-add}[Pst@]{ScyBase}[true]{}%<br>

\define@boolkey[psset]{pstricks-add}[Pst@]{ScxBase}[true]{}%<br>\psset{ScyBase=true,ScxBase=true}<br><br>\def\pstScalePoints(#1,#2)#3#4{%<br>%  xScale | yScale | xOperator | yOperator  <br>% the operators can be any Postscript code<br>

\pst@def{ScalePoints}<%<br>    /y ED /x ED<br>    /yOper { #4\space y mul #2\space mul } def<br>    /xOper { #3\space x mul #1\space mul } def<br>    counttomark dup dup cvi eq not { exch pop } if<br>    /m exch def /n m 2 div cvi def<br>

    n {<br>      #4\space y mul #2\space mul m 1 roll<br>      #3\space x mul #1\space mul m 1 roll<br>      /m m 2 sub<br>      def } repeat>%<br>}<br>\def\psLineToXAxis@ii{%<br>\addto@pscode{\pst@cp \psline@iii \tx@LineToXAxis}%<br>

\end@OpenObj}<br><br>\def\tx@LineToXAxis{LineToXAxis }<br><br>\pst@def{LineToXAxis}<{%<br>NArray<br>n 0 eq not<br>  { %n 1 eq { 0 0 /n 2 def } if<br>    %ArrowA<br>    %/n n 2 sub def<br>    %2 copy pop 0 \ifPst@ScyBase yOper \fi moveto Lineto<br>

    n { 2 copy 2 copy pop 0 \ifPst@ScyBase yOper \fi 4 2 roll ArrowA Lineto <br>        2 copy pop 0 \ifPst@ScyBase yOper \fi ArrowB L pop pop<br>    } repeat<br>    %2 copy moveto pop 0 \ifPst@ScyBase yOper \fi<br>    %L<br>

    %pop pop <br>} if}><br><br>\def\psLineToYAxis@ii{%<br>\addto@pscode{\pst@cp \psline@iii \tx@LineToYAxis}%<br>\end@OpenObj}<br>\def\tx@LineToYAxis{LineToYAxis }<br>\pst@def{LineToYAxis}<{<br>NArray<br>n 0 eq not<br>

  { %n 1 eq { 0 0 /n 2 def } if<br>    %ArrowA<br>    %/n n 2 sub def<br>    %CP 2 copy moveto exch pop 0 \ifPst@ScxBase xOper \fi exch Lineto<br>    n { 2 copy 2 copy exch pop 0 \ifPst@ScxBase xOper \fi exch 4 2 roll ArrowA Lineto<br>

        2 copy exch pop 0 \ifPst@ScxBase xOper \fi exch ArrowB L pop pop <br>    } repeat<br>    %2 copy moveto exch pop 0 \ifPst@ScxBase xOper \fi exch<br>    %L<br>    %pop pop <br>} if}><br>%<br>%%%%%%PREPAREPOINTS<br>

\define@key[psset]{pstricks-add}{plotNoTwo}{\def\psk@plotNoTwo{#1}}%<br>\define@key[psset]{pstricks-add}{plotNoTwoFunc}{\def\psk@plotNoTwoFunc{#1}} %Must operate on two stack elements and return one<br>\psset{plotNoTwo=0,plotNoTwoFunc=dup mul exch dup mul add sqrt}<br>

<br>%\def\tx@PreparePoints{PreparePoints }<br>\pst@def{PreparePoints}<{%<br>  counttomark /m exch def<br>  \ifPsk@xyValues\else % we have only y values<br>    /mm m def<br>    /M m 1 add def<br>    m { mm exch M 2 roll /M M 1 add def /mm mm 1 sub def } repeat<br>

    /m m dup add def<br>  \fi<br>  \ifPst@ChangeOrder<br>    /m0 m def<br>    m \psk@plotNoMax\space 1 add div 1 sub cvi {<br>      m0 \psk@plotNoMax\space 1 add roll /m0 m0 \psk@plotNoMax\space 1 add sub def<br>    } repeat<br>

  \fi<br>  /n m \psk@plotNoMax\space 1 add div cvi def<br>  \psk@plotNoMax\space 1 gt {% multiple data files?<br>    n {<br>      \psk@plotNoTwo\space 0 gt {<br>        \psk@plotNoMax\space copy<br>        \psk@plotNoMax\space \psk@plotNoTwo\space 1 sub neg roll % x yNo y yNoTwo y [yNo y yNoTwo y]<br>

        \psk@plotNoMax\space 1 sub { pop } repeat % x yNo y yNoTwo y yNoTwo<br>        \psk@plotNoMax\space 1 add 1 roll } if<br>      \psk@plotNoMax\space \psk@plotNo\space 1 sub neg roll % x yNo y y y ...<br>      \psk@plotNoMax\space 1 sub { pop } repeat % x [yNoTwo] yNo<br>

      \psk@plotNoTwo\space 0 gt {<br>          \psk@plotNoTwoFunc\space } if %x f(yNo,yNoTwo) <br>      /m m \psk@plotNoMax\space 1 sub sub def<br>      m 2 roll<br>    } repeat<br>  } if % no multiple data files<br>%    counttomark /m exch def<br>

%    /n m 2 div cvi def<br>  /xMax -99999 def /yMax -99999 def<br>  /xP 0 def /yP 0 def<br>  m copy<br>  n {<br>    /y exch def /x exch def<br>    xMax x lt { /xMax x def } if<br>    yMax y lt {/yMax y def } if<br>    xP x gt { /xP x def } if<br>

    yP y gt { /yP y def } if<br>  } repeat<br>%    m 2 roll<br>  \psk@xStep\space 0 gt \psk@yStep\space 0 gt or (\psk@xStart) length 0 gt or<br>  (\psk@yStart) length 0 gt or (\psk@xEnd) length 0 gt or (\psk@yEnd) length 0 gt or {<br>

%<br>    (\psk@xStart) length 0 gt {\psk@xStart\space }{ xP } ifelse /xStart exch def<br>    (\psk@yStart) length 0 gt {\psk@yStart\space }{ yP } ifelse /yStart exch def<br>    (\psk@xEnd) length 0 gt { \psk@xEnd\space }{ xMax } ifelse /xEnd exch def<br>

    (\psk@yEnd) length 0 gt { \psk@yEnd\space }{ yMax } ifelse /yEnd exch def<br>    n {<br>      m -2 roll<br>      2 copy /yVal exch def /xVal exch def<br>      xVal xP ge<br>      yVal yP ge and<br>      xVal xEnd le and<br>

      yVal yEnd le and<br>      xVal xStart ge and<br>      yVal yStart ge and {<br>        /xP xP \psk@xStep\space add def<br>        /yP yP \psk@yStep\space add def<br>      }{%<br>        pop pop<br>        /m m 2 sub def<br>

      } ifelse<br>    } repeat<br>  }{%<br>    /ncount 0 def<br>    (\psk@nEnd) length 0 gt { \psk@nEnd\space }{ m } ifelse <br>    /nEnd exch def<br>    n {<br>      m -2 roll<br>      \psk@nStep\space 1 gt {<br>        ncount \psk@nStart\space sub \psk@nStep\space mod 0 eq }{ true } ifelse<br>

        ncount nEnd le and<br>        ncount \psk@nStart\space ge and not {<br>          pop pop<br>          /m m 2 sub def<br>        } if<br>        /ncount ncount 1 add def<br>      } repeat<br>  } ifelse<br>}><br>

%<br><br>\def\beginplot@PrintCoor{\begin@SpecialObj}<br>\def\endplot@PrintCoor{%<br>  \psPrintCoor@ii %\psk@fillstyle\ifpsshadow\pst@closedshadow\fi%<br>  %\pst@stroke<br>  \end@SpecialObj%<br>}<br>\define@key[psset]{pstricks-add}{relxerr}{\def\psk@relxerr{#1}}<br>

\define@key[psset]{pstricks-add}{relyerr}{\def\psk@relyerr{#1}}<br>\define@key[psset]{pstricks-add}{yShift}{\def\psk@yShift{#1}}<br>\define@boolkey[psset]{pstricks-add}[Pst@]{science}[true]{}%<br>\psset[pstricks-add]{science=false,relxerr=0.1,relyerr=0.1,yShift=0}<br>

%Following is new pst-func.tex key which conflicts with mine.  <br>%Must specify [pstricks-add] in psset to correct.<br>%\define@boolkey[psset]{pst-add}[Pst@]{science}[true]{%<br>%  \ifPst@science\def\psk@Scin{true }\else\def\psk@Scin{false }\fi}<br>

<br>\def\psPrintCoor@ii{%<br>   \addto@pscode{%<br>      false <br>      \tx@NArray<br>      \pst@number\psxunit<br>      \pst@number\psyunit<br>      \psPrintCoor@iii<br>}}<br><br>\def\psPrintCoor@iii{%<br>     /mfont { \psk@PSfont\space findfont \psk@fontscale\space scalefont setfont } bind def<br>

     /mfontexp { \psk@PSfont findfont \psk@fontscale 1.2 div scalefont setfont } bind def<br>     /s1 { /Symbol findfont \psk@fontscale\space scalefont setfont } bind def<br>     /ttxspc \psk@fontscale\space 4 div def<br>

     /txspc ttxspc 4 div def<br>     %pop<br>     /ysc ED<br>     /xsc ED<br>     n 0 eq not {% <br>     n {%<br>     ysc div /Yval ED <br>     xsc div /Xval ED<br>   \ifPst@science<br>     %X Coordinate  <br>     Xval 0 gt { Xval log floor }{ Xval 0 lt { Xval -1 mul log floor }{ 0 } ifelse } ifelse <br>

     cvi /xcoorexp ED   <br>     Xval 10 xcoorexp exp div <br>     \psk@decimals\space -1 gt {%<br>     10 \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>     \psk@decimals\space 0 eq { cvi } if /xcoor ED<br>

     %Y Coordinate<br>     Yval 0 gt { Yval log floor }{ Yval 0 lt { Yval -1 mul log floor }{ 0 } ifelse } ifelse <br>     cvi /ycoorexp ED   <br>     Yval 10 ycoorexp exp div <br>     \psk@decimals\space -1 gt {%<br>     10 \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>

     \psk@decimals\space 0 eq { cvi } if /ycoor exch def<br>     %Prep Strings<br>     xcoorexp \psk@valuewidth\space string cvs /xcoorexp ED<br>     ycoorexp \psk@valuewidth\space string cvs /ycoorexp ED <br>     xcoor \psk@valuewidth\space string cvs /xcoor ED<br>

     ycoor \psk@valuewidth\space string cvs /ycoor ED<br>     %X Error<br>     \psk@relxerr\space Xval mul /delx ED \psk@relxerr\space 0 ne {%<br>     delx 0 gt { delx log floor }{ delx 0 lt { delx -1 mul log floor }{ 0 } ifelse } ifelse <br>

     cvi /delxexp ED<br>     delx 10 delxexp exp div dup mul sqrt<br>     \psk@decimals\space -1 gt {%<br>     10 \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>     \psk@decimals\space 0 eq { cvi } if /delx ED<br>

     %Prep Strings<br>     delxexp \psk@valuewidth\space string cvs /delxexp ED<br>     delx \psk@valuewidth\space string cvs /delx ED } if<br>     %Y Error     <br>     \psk@relyerr\space Yval mul /dely ED \psk@relyerr\space 0 ne {%<br>

     dely 0 gt { dely log floor }{ dely 0 lt { dely -1 mul log floor }{ 0 } ifelse } ifelse <br>     cvi /delyexp ED <br>     dely 10 delyexp exp div dup mul sqrt<br>     \psk@decimals\space -1 gt {%<br>     10 \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>

     \psk@decimals\space 0 eq { cvi } if /dely ED<br>     %Prep Strings<br>     delyexp \psk@valuewidth\space string cvs /delyexp ED<br>     dely \psk@valuewidth\space string cvs /dely ED } if<br>   \else<br>     Xval \psk@decimals\space -1 gt <br>

     { 10 \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>     \psk@decimals\space 0 eq {cvi} if /xcoor ED<br>     Yval \psk@decimals\space -1 gt <br>     { 10 \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>

     \psk@decimals\space 0 eq {cvi} if /ycoor ED<br>     xcoor \psk@valuewidth\space string cvs /xcoor ED<br>     ycoor \psk@valuewidth\space string cvs /ycoor ED<br>     %<br>     \psk@relxerr\space Xval mul dup mul sqrt <br>

     \psk@decimals\space -1 gt <br>     { 10   \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>     \psk@decimals\space 0 eq {cvi} if /delx ED<br>     \psk@relyerr\space Yval mul dup mul sqrt <br>     \psk@decimals\space -1 gt <br>

     { 10   \psk@decimals\space exp dup 3 1 roll mul round exch div } if<br>     \psk@decimals\space 0 eq {cvi} if /dely ED<br>     delx \psk@valuewidth\space string cvs /delx ED<br>     dely \psk@valuewidth\space string cvs /dely ED<br>

   \fi<br>%     <br>     newpath<br>     Xval xsc mul %\psk@xShift\space xsc mul add <br>     Yval ysc mul %\psk@yShift\space ysc mul add<br>     moveto <br>     \Pst@Debug\space 0 gt { <br>     mfont <br>     Xval \psk@valuewidth\space string cvs show (,) show <br>

     Yval \psk@valuewidth\space string cvs show }<br>     {s1 (\string\050) show  <br>     mfont xcoor show<br>       \ifPst@science <br>       mfont (x) show<br>       mfont (10) show <br>       0 ttxspc rmoveto mfontexp xcoorexp show<br>

       \fi<br>     \psk@relxerr\space 0 ne <br>     { \ifPst@science <br>       0 ttxspc neg rmoveto s1 (\string\261) show<br>       mfont delx show<br>       mfont (x) show<br>       mfont (10) show <br>       0 ttxspc rmoveto mfontexp delxexp show<br>

       0 ttxspc neg rmoveto s1 (,) show<br>       \else<br>       s1 (\string\261) show<br>       mfont delx show<br>       s1 (,) show<br>       \fi } <br>     { \ifPst@science <br>       0 ttxspc neg rmoveto s1 (,) show<br>

       \else<br>       s1 (,) show<br>       \fi } ifelse<br>%start on ycoor    <br>     mfont ycoor show<br>       \ifPst@science <br>       mfont (x) show<br>       mfont (10) show <br>       0 ttxspc rmoveto mfontexp ycoorexp show<br>

       \fi<br>     \psk@relyerr\space 0 ne <br>     { \ifPst@science <br>       0 ttxspc neg rmoveto s1 (\string\261) show <br>       mfont dely show<br>       mfont (x) show<br>       mfont (10) show <br>       0 ttxspc rmoveto mfontexp delyexp show<br>

       0 ttxspc neg rmoveto s1 (\string\051) show<br>       \else<br>       s1 (\string\261) show <br>       mfont dely show<br>       s1 (\string\051) show <br>       \fi }<br>       { s1 (\string\051) show } ifelse } ifelse<br>

 } repeat } if }<br><br>%%%POLY FIT<br>\define@key[psset]{pstricks-add}{EqPos}[{}]{\def\psk@EqPos{#1}}<br>\define@boolkey[psset]{pstricks-add}[Pst@]{ShowEq}[true]{}%<br>\psset{EqPos=,ShowEq=true}<br><br>\define@key[psset]{pstricks-add}{PolyOrder}[{}]{\def\psk@PolyOrder{#1}}<br>

\define@boolkey[psset]{pstricks-add}[Pst@]{ReduceOrder}[true]{%these percents are critical removal results in shift to in x-dir<br>\ifPst@ReduceOrder%<br>\def\psk@ReduceOrder{true}\else\def\psk@ReduceOrder{false}\fi}%<br>

\define@boolkey[psset]{pstricks-add}[Pst@]{PowerFit}[true]{%these percents are critical removal results in shift to in x-dir<br>\ifPst@PowerFit%<br>\def\psk@PowerFit{true}\def\psk@LogEFit{false}%<br>\def\psk@LogTFit{false}\def\psk@ExpFit{false}%<br>

\def\psk@GaussFit{false}\def\psk@CustomFit{false}\def\psk@RecipFit{false}%<br>\else\def\psk@PowerFit{false}\fi}%<br>\define@boolkey[psset]{pstricks-add}[Pst@]{LogEFit}[true]{%<br>\ifPst@LogEFit%<br>\def\psk@PowerFit{false}\def\psk@LogEFit{true}%<br>

\def\psk@LogTFit{false}\def\psk@ExpFit{false}%<br>\def\psk@GaussFit{false}\def\psk@CustomFit{false}\def\psk@RecipFit{false}%<br>\else\def\psk@LogEFit{false}\fi}%<br>\define@boolkey[psset]{pstricks-add}[Pst@]{LogTFit}[true]{%<br>

\ifPst@LogTFit%<br>\def\psk@PowerFit{false}\def\psk@LogEFit{false}%<br>\def\psk@LogTFit{true}\def\psk@ExpFit{false}%<br>\def\psk@GaussFit{false}\def\psk@CustomFit{false}\def\psk@RecipFit{false}%<br>\else\def\psk@LogTFit{false}\fi}%<br>

\define@boolkey[psset]{pstricks-add}[Pst@]{ExpFit}[true]{%<br>\ifPst@ExpFit%<br>\def\psk@PowerFit{false}\def\psk@LogEFit{false}%<br>\def\psk@LogTFit{false}\def\psk@ExpFit{true}%<br>\def\psk@GaussFit{false}\def\psk@CustomFit{false}\def\psk@RecipFit{false}%<br>

\else\def\psk@ExpFit{false}\fi}%<br>\define@boolkey[psset]{pstricks-add}[Pst@]{GaussFit}[true]{%<br>\ifPst@GaussFit%<br>\def\psk@PowerFit{false}\def\psk@LogEFit{false}%<br>\def\psk@LogTFit{false}\def\psk@ExpFit{false}%<br>

\def\psk@GaussFit{true}\def\psk@CustomFit{false}\def\psk@RecipFit{false}%<br>\else\def\psk@GaussFit{false}\fi}%<br>\define@boolkey[psset]{pstricks-add}[Pst@]{RecipFit}[true]{%<br>\ifPst@RecipFit%<br>\def\psk@PowerFit{false}\def\psk@LogEFit{false}%<br>

\def\psk@LogTFit{false}\def\psk@ExpFit{false}%<br>\def\psk@GaussFit{false}\def\psk@CustomFit{false}\def\psk@RecipFit{true}%<br>\else\def\psk@RecipFit{false}\fi}%<br>\define@boolkey[psset]{pstricks-add}[Pst@]{CustomFit}[true]{%<br>

\ifPst@CustomFit%<br>\def\psk@PowerFit{false}\def\psk@LogEFit{false}%<br>\def\psk@LogTFit{false}\def\psk@ExpFit{false}%<br>\def\psk@GaussFit{false}\def\psk@CustomFit{true}\def\psk@RecipFit{false}%<br>\else\def\psk@CustomFit{false}\fi}%<br>

\define@key[psset]{pstricks-add}{FXtrans}[{}]{\def\psk@FXtrans{#1}}<br>\define@key[psset]{pstricks-add}{FYtrans}[{}]{\def\psk@FYtrans{#1}}<br>\define@key[psset]{pstricks-add}{RYtrans}[{}]{\def\psk@RYtrans{#1}}<br>\define@key[psset]{pstricks-add}{Yint}[{}]{\def\psk@Yint{#1}}<br>

\define@key[psset]{pstricks-add}{CheckZeroX}[{}]{\def\psk@CheckZeroX{#1}}<br>\define@key[psset]{pstricks-add}{CheckZeroY}[{}]{\def\psk@CheckZeroY{#1}}<br>\psset{PolyOrder=1,ReduceOrder=false,PowerFit=false,LogEFit=false,LogTFit=false,%<br>

      ExpFit=false,GaussFit=false,RecipFit=false,CustomFit=false,%<br>        FXtrans=,FYtrans=,RYtrans=,Yint=,CheckZeroX=,CheckZeroY=}<br><br>\def\beginplot@GLLSR{\begin@SpecialObj}<br>\def\endplot@GLLSR{%<br>  \psGLLSR@ii\psk@fillstyle\ifpsshadow\pst@closedshadow\fi%<br>

  \pst@stroke<br>  \end@SpecialObj%<br>}<br>\def\psGLLSR@ii{\addto@pscode{false \tx@NArray \psGLLSR@iii }}<br>\def\psGLLSR@iii{%<br>  %General Fit Model: y = a0 + a1*x + a2*x^2 + ... + an*x^n <br>  %Define Fonts<br>  /mfont { \psk@PSfont\space findfont \psk@fontscale\space scalefont setfont } bind def<br>

  /mfontbig { \psk@PSfont\space findfont \psk@fontscale\space 2 mul scalefont setfont } bind def<br>  /mfontexp { \psk@PSfont\space findfont \psk@fontscale\space 2 div scalefont setfont } bind def<br>   mfont<br>  %Default parameters<br>

  (\psk@PolyOrder) length 0 gt { \psk@PolyOrder\space /order ED }{ /order 1 def } ifelse<br>  /PolyEq true def <br>  (\psk@Yint) length 0 gt <br>    {\psk@Yint\space /Yint ED /setYint true def /ReduceOrder true def }<br>
    { /Yint 0 def /setYint false def /ReduceOrder false def} ifelse<br>
  /CheckZeroX false def<br>  /CheckZeroY false def<br>  /FXtrans {1 mul} def<br>  /FYtrans { Yint sub } def<br>  /RYtrans {1 mul} def<br>  /xPr {(x) show} def<br>  %Special Fit Functions (Linear Transforms)<br>  \psk@PowerFit\space { /order 1 def /CheckZeroX true def /CheckZeroY true def /PolyEq false def <br>

       /FXtrans {log} def /FYtrans {Yint sub log} def /RYtrans {10 exch exp Yint add} def /ReduceOrder false def } if <br>  \psk@LogTFit\space { /order 1 def /CheckZeroX true def /PolyEq true def <br>       /xPr { (log) show (\string\050) show (x) show (\string\051) show } def<br>

       /FXtrans {log} def /FYtrans {1 mul} def /RYtrans {1 mul} def } if %<br>  \psk@LogEFit\space { /order 1 def /CheckZeroX true def /PolyEq true def <br>        /xPr { (ln) show (\string\050) show (x) show (\string\051) show } def<br>

       /FXtrans {ln} def /FYtrans {1 mul} def /RYtrans {1 mul} def } if %<br>  \psk@ExpFit\space { /order 1 def /CheckZeroY true def /PolyEq false def <br>       /FXtrans {1 mul} def /FYtrans {Yint sub ln} def /RYtrans {Euler exch exp Yint add} def  /ReduceOrder false def } if %<br>

  \psk@GaussFit\space { /order 2 def /CheckZeroY true def /PolyEq false def <br>       /FXtrans {1 mul} def /FYtrans {Yint sub ln} def /RYtrans {Euler exch exp Yint add} def  /ReduceOrder false def } if %<br>  \psk@RecipFit\space { /order 1 def /CheckZeroX true def /PolyEq true def <br>

        /xPr { (\string\050) show (1) show (\string\244) show (x) show (\string\051) show } def<br>       /FXtrans { 1 exch div } def /FYtrans {1 mul} def /RYtrans {1 mul} def } if <br>  \psk@CustomFit\space { /PolyFit false def <br>

       (\psk@FXtrans) length 0 gt { {\psk@FXtrans\space} /FXtrans ED } if  <br>       (\psk@FYtrans) length 0 gt { {\psk@FYtrans\space} /FYtrans ED } if<br>       (\psk@RYtrans) length 0 gt { {\psk@RYtrans\space} /RYtrans ED } if<br>

       (\psk@CheckZeroX) length 0 gt { {\psk@CheckZeroX\space} /CheckZeroX ED } if<br>       (\psk@CheckZeroY) length 0 gt { {\psk@CheckZeroY\space} /CheckZeroY ED } if <br>       (\psk@ReduceOrder) length 0 gt { {\psk@ReduceOrder\space} /ReduceOrder ED } if } if %<br>

  %Initialize Arrays<br>  /A order 1 add order 1 add mul array def <br>  /B order 1 add array def <br>  /ai order 1 add array def<br>  %Coordinate Conversion Operators X Y PLU -> Plot Units (pts), X Y RLU -> Real Units (arbitrary)<br>

  /PLU {exch \pst@number\psxunit\space mul exch \pst@number\psyunit\space mul } def<br>  /RLU {exch \pst@number\psxunit\space div exch \pst@number\psyunit\space div } def<br>  /PRA { %Inputs: Array [ #rows #cols X Y Scale boolean(print equal sign) boolean(return) ]<br>

         %"pra" prefix has been added to all variables to minimize chance of naming conflicts<br>%         /praSc exch def /praYc exch def /praXc exch def <br>%         /praCol exch def /praRow exch def /praARY exch def <br>

         /praTemp exch def /praARY exch def <br>         praTemp length 7 eq {%<br>         %praTemp 4 get /praSc exch def <br>         %praTemp 3 get /praYc exch def <br>         %praTemp 2 get /praXc exch def <br>         %praTemp 1 get /praCol exch def <br>

         %praTemp 0 get /praRow exch def pop<br>         /tempfontscale \psk@fontscale praTemp 4 get mul def<br>         %/praXc praTemp 2 get \pst@number\psxunit\space mul def<br>         /praYc praTemp 3 get \pst@number\psyunit\space mul def<br>

         /praXmax -999999 def<br>         /praYmin 999999 def<br>         /prafont {\psk@PSfont\space findfont tempfontscale scalefont setfont} bind def<br>         /prasym { /Symbol findfont tempfontscale 2 mul scalefont setfont} bind def<br>

         prafont<br>         praTemp 2 get \pst@number\psxunit\space mul praTemp 3 get \pst@number\psyunit\space mul moveto<br>         praARY length praTemp 1 get praTemp 0 get mul eq not { (Row x Col > Vector Dim) show }{%<br>

         /praXstart praTemp 2 get \pst@number\psxunit\space mul def<br>         0 1 praTemp 1 get 1 sub {/praj ED<br>         0 1 praTemp 0 get 1 sub {/prai ED /prak praj praTemp 1 get prai mul add def<br>         praARY prak get \psk@valuewidth string cvs show<br>

         currentpoint pop dup praXmax gt { /praXmax ED }{ pop } ifelse <br>         currentpoint pop praXstart sub neg tempfontscale 1.5 mul neg rmoveto<br>         } for<br>         currentpoint exch pop dup praYmin lt { /praYmin ED }{ pop } ifelse <br>

         /praXstart praXmax tempfontscale 0.75 mul add def<br>         praXstart praTemp 3 get \pst@number\psyunit\space mul moveto <br>         } for <br>         %Brackets<br>          newpath<br>          praTemp 2 get \pst@number\psxunit\space mul tempfontscale 0.125 mul add <br>

          praTemp 3 get \pst@number\psyunit\space mul tempfontscale add moveto <br>          praTemp 2 get \pst@number\psxunit\space mul tempfontscale 0.125 mul sub <br>          praTemp 3 get \pst@number\psyunit\space mul tempfontscale add lineto <br>

          praTemp 2 get \pst@number\psxunit\space mul tempfontscale 0.125 mul sub <br>          praYmin tempfontscale add lineto<br>          praTemp 2 get \pst@number\psxunit\space mul tempfontscale 0.125 mul add <br>          praYmin tempfontscale add lineto<br>

          stroke <br>          newpath<br>          praXmax tempfontscale 0.125 mul sub <br>          praTemp 3 get \pst@number\psyunit\space mul tempfontscale add moveto <br>          praXmax tempfontscale 0.125 mul add <br>

          praTemp 3 get \pst@number\psyunit\space mul tempfontscale add lineto <br>          praXmax tempfontscale 0.125 mul add <br>          praYmin tempfontscale add lineto<br>          praXmax tempfontscale 0.125 mul sub <br>

          praYmin tempfontscale add lineto<br>          stroke <br>          praTemp 5 get { <br>          praXmax tempfontscale add <br>          praTemp 3 get \pst@number\psyunit\space mul tempfontscale add praYmin add 2 div moveto<br>

          prasym (=) show currentpoint pop /praXmax ED} if<br>         %Left Bracket<br>         praTemp 2 get \pst@number\psxunit\space mul praYmin tempfontscale 2 mul sub moveto %Return to bottom left<br>         %the following are defined for use with cascade calls to PRA<br>

         % (Xl,Yb) - Print next matrix below last<br>         % (Xr,Yt) - Print next matrix beside last<br>         % (Xr,Yb) - Print next matrix beside and below last<br>         tx@Dict /praYb known {<br>         praYmin tempfontscale 1.5 mul sub \pst@number\psyunit\space div praYb lt {<br>

         /praYb praYmin tempfontscale 1.5 mul sub \pst@number\psyunit\space div def } if }<br>         { /praYb praYmin tempfontscale 1.5 mul sub \pst@number\psyunit\space div def } ifelse<br>         /praYb praYmin tempfontscale 1.5 mul sub \pst@number\psyunit\space div def<br>

         %<br>         tx@Dict /praXl known not {/praXl praTemp 2 get def } if<br>        % { praTemp 6 get {/praXl praTemp 2 get def} if } ifelse  <br>         tx@Dict /praYt known not {/praYt praTemp 3 get def }<br>         { praTemp 6 get {/praYt praYb def} if } ifelse<br>

         %<br>         tx@Dict /praXr known {<br>         praTemp 6 get { /praXr praXl def }{ /praXr praXmax tempfontscale add \pst@number\psxunit\space div def } ifelse }{%<br>         /praXr praXmax tempfontscale add \pst@number\psxunit\space div def } ifelse<br>

         \psk@PSfont\space findfont \psk@fontscale\space scalefont setfont } ifelse<br>         }{ \psk@PSfont\space findfont \psk@fontscale\space scalefont setfont <br>         0 0 moveto (PRA Error Not Enough Parameters) show } ifelse } def<br>

  0 1 A length 1 sub { A exch 0 put } for<br>  0 1 B length 1 sub { B exch 0 put } for<br>  0 1 ai length 1 sub { ai exch 0 put } for<br>  %%%%%%%%<br>  %Remove Zero Data (As Required By Transformation Functions)<br>  CheckZeroX CheckZeroY or {<br>

  n { /tmpx false def /tmpy false def<br>    CheckZeroY { dup \pst@number\psyunit\space div Yint sub 0 le { /tmpy true def  } if } if   <br>    CheckZeroX { exch dup \pst@number\psxunit\space div 0 le { /tmpx true def } if exch } if<br>

    tmpx tmpy or { pop pop /n n 1 sub def }{ n 2 mul 2 roll } ifelse<br>    } repeat } if<br>  %%%<br>  %%%%<br>  %Determine Max/Min X for Plotting<br>  exch dup dup <br>  \pst@number\psxunit\space div /xEnd ED <br>  \pst@number\psxunit\space div /xStart ED     <br>

  exch<br>  /ybar 0 def<br>  n {                         % number of data pairs<br>    dup \pst@number\psyunit\space div ybar add /ybar ED <br>    2 copy      %copy point<br>    \pst@number\psyunit\space div /Yval ED <br>

    \pst@number\psxunit\space div /Xval ED<br>    Xval xStart lt { /xStart Xval def } if    % find the lowest xi<br>    Xval xEnd gt { /xEnd Xval def } if        % find the largest xi<br>    n 2 mul 2 roll    %roll the original point to the bottom of the stack<br>

  } repeat<br>  ybar n div /ybar ED<br>  %Scale X & Y variables and apply Linear Transform if applicable<br>  n {<br>    \pst@number\psyunit\space div FYtrans<br>    n 2 mul 1 roll<br>    \pst@number\psxunit\space div FXtrans<br>

    n 2 mul 1 roll<br>  } repeat<br>  %START ASSEMBLY OF LEAST SQUARES MATRIX<br>  1 1 order 1 add { /ci exch def <br>    1 1 ci { /cj exch def<br>      /epk ci cj add 2 sub def <br>      /sum 0 def<br>      n { n 2 mul 1 roll<br>

        dup epk exp sum add /sum ED<br>        n 2 mul 1 roll<br>      } repeat<br>      A <br>      ci 1 sub order 1 add mul cj add 1 sub <br>      sum put %i row, j col standard<br>      A <br>      cj 1 sub order 1 add mul ci add 1 sub <br>

      sum put %j row, i col reversed<br>    } for<br>    /sum 0 def<br>    1 1 n { /cl exch def<br>      2 copy <br>      exch <br>      ci 1 sub exp mul sum add /sum ED<br>      n 2 mul 2 roll<br>    } for<br>    B<br>    ci 1 sub <br>

    sum put<br>  } for<br>  \Pst@Debug\space 1 eq {<br>  A [ order 1 add order 1 add 5 20 0.5 false false ] PRA<br>  B [ order 1 add 1 praXr praYt 0.5 false true ] PRA<br>  } if<br>  %END OF ASSEMBLE MATRIX<br> %REDUCE ORDER FOR Y INTERCEPT FOR MODELS WHICH ARE APPROPRIATE<br>

  ReduceOrder {<br>    /elemOld { exch 1 sub order 1 add mul add 1 sub } def<br>    /elemNew { exch 2 sub order mul add 2 sub  } def      <br>    /dummyA order order mul array def                     <br>    0 1 dummyA length 1 sub { dummyA exch 0 put } for   <br>

    /dummyB order array def <br>    0 1 dummyB length 1 sub { dummyB exch 0 put } for<br>    %Translate A to dummyA<br>    2 1 order 1 add {/ci ED<br>      2 1 order 1 add {/cj ED<br>        dummyA ci cj elemNew<br>        A ci cj elemOld get<br>

        put<br>      } for <br>      dummyB ci 2 sub<br>      B ci 1 sub get<br>      put<br>    } for <br>  /order order 1 sub def                                             %temporarily reduce system order<br>  /A order 1 add order 1 add mul array def 0 1 A length 1 sub {/ci ED A ci dummyA ci get put } for  %put dummyA in new A<br>

  /B order 1 add array def 0 1 B length 1 sub {/ci ED B ci dummyB ci get put } for                  %put dummyB in new B<br>  \Pst@Debug\space 1 eq {<br>  A [ order 1 add order 1 add praXr praYt 0.5 false false ] PRA<br>
  B [ order 1 add 1 praXr praYt 0.5 false true ] PRA } if<br>
  \tx@GaussSolve<br>  /order order 1 add def                                             %restore system order<br>  /m m 1 add def<br>   \Pst@Debug\space 1 eq {<br>  ai [ order 1 add 1 praXr praYt 0.5 false false ] PRA } if<br>

  /dummyai order 1 add array def<br>  0 1 dummyai length 1 sub {/ci ED dummyai ci 0 put } for<br>  0 1 ai length 2 sub {/ci ED dummyai ci 1 add ai ci get put } for<br>  /ai dummyai def<br>  ai 0 Yint put<br>  }{ \tx@GaussSolve } ifelse<br>

  \Pst@Debug\space 1 eq {<br>  ai [ order 1 add 1 praXr praYt 0.5 false false ] PRA } if<br>  %%%%%%%%%%%%%%%%%%%%%%%%%%<br>  %% END SOLVE CURVE FITS %%<br>  %%%%%%%%%%%%%%%%%%%%%%%%%%<br>  %%%%%%%%%%%%%%%%%%%%%<br>  %% PLOT CURVE FITS %%<br>

  %%%%%%%%%%%%%%%%%%%%%<br>  newpath<br>  (\psk@xStart) length 0 gt             % special start value?<br>  { \psk@xStart\space /xStart ED } if  <br>  (\psk@xEnd) length 0 gt             % special end value?<br>  { \psk@xEnd\space /xEnd ED } if <br>

  /xStep xEnd xStart sub \psk@plotpoints\space div def<br>  /Xnow xStart def<br>  /Ynow 0 def<br>  1 1 m { /ci exch def ai ci 1 sub get ci 1 sub { Xnow FXtrans mul } repeat Ynow add /Ynow exch def } for <br>  Xnow Ynow RYtrans PLU moveto<br>

  \psk@plotpoints\space cvi<br>  { /Xnow Xnow xStep add def<br>  /Ynow 0 def<br>  1 1 m { /ci exch def ai ci 1 sub get ci 1 sub { Xnow FXtrans mul } repeat Ynow add /Ynow exch def } for<br>  Xnow Ynow RYtrans PLU lineto<br>

  } repeat<br>  %<br>  /yminusdot 0 def<br>  /yminusbar 0 def<br>  n {<br>    2 copy<br>    /Ynow ED<br>    /Xnow ED<br>    /Ydot 0 def<br>    1 1 m { /ci exch def <br>     ai ci 1 sub get ci 1 sub { Xnow mul } repeat Ydot add /Ydot exch def } for %<br>

    Ynow Ydot sub dup mul yminusdot add /yminusdot ED<br>    Ynow ybar sub dup mul yminusbar add /yminusbar ED<br>    n 2 mul 2 roll<br>  } repeat<br>  1 yminusdot yminusbar div sub /rsquared ED<br>  %%%%%%%%%%%%%%%%%%%%%%%%%<br>

  %% END PLOT CURVE FITS %%<br>  %%%%%%%%%%%%%%%%%%%%%%%%%<br>  %%%%%%%%%%%%%%%%%%%%%%%%%%%<br>  %% START PRINT EQUATIONS %%<br>  %%%%%%%%%%%%%%%%%%%%%%%%%%%<br>  \ifPst@ShowEq<br>  % Setup Cursor<br>  (\psk@EqPos) length 0 gt<br>

  {\psk@EqPos\space PLU }<br>  {2 -5 PLU } ifelse moveto <br> % Power Fit Equation %<br>  \psk@PowerFit\space {<br>  10 ai 0 get exp<br>  \psk@decimals\space -1 gt <br>    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>

    \psk@decimals\space 0 eq { cvi } if  /tmpA exch def<br>  ai 1 get <br>  \psk@decimals\space -1 gt <br>    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>    \psk@decimals\space 0 eq { cvi } if  /tmpB exch def<br>

  (y = ) show<br>  tmpA  \psk@valuewidth string cvs show<br>  (x) show<br>  0 \psk@fontscale 4 div rmoveto <br>  mfontexp tmpB \psk@valuewidth string cvs show mfont<br>  0 \psk@fontscale 4 div neg rmoveto<br>  setYint Yint 0 ne and { Yint 0 gt { (+) show } if Yint \psk@valuewidth string cvs show } if } if<br>

 % Exponential Fit Equation %<br>  \psk@ExpFit\space {<br>  Euler ai 0 get exp<br>  \psk@decimals\space -1 gt <br>    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>    \psk@decimals\space 0 eq { cvi } if  /tmpA exch def<br>

  ai 1 get <br>  \psk@decimals\space -1 gt <br>    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>    \psk@decimals\space 0 eq { cvi } if  /tmpB exch def<br>  (y = ) show<br>  tmpA \psk@valuewidth string cvs show<br>

  (e) show<br>  0 \psk@fontscale 4 div rmoveto <br>  mfontexp tmpB \psk@valuewidth string cvs show <br>  (x) show mfont <br>  0 \psk@fontscale 4 div neg rmoveto<br>  setYint Yint 0 ne and { Yint 0 gt { (+) show } if Yint \psk@valuewidth string cvs show } if} if<br>

  % Gaussian Fit Equation %<br>  \psk@GaussFit\space {<br>  /tmpA Euler ai 0 get ai 1 get dup mul 4 div ai 2 get div sub exp def<br>  /tmpB ai 1 get 2 div ai 2 get div def <br>  /tmpC ai 2 get def<br>  tmpA<br>  \psk@decimals\space -1 gt <br>

    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>    \psk@decimals\space 0 eq { cvi } if  /tmpA exch def<br>  tmpB <br>  \psk@decimals\space -1 gt <br>    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>

    \psk@decimals\space 0 eq { cvi } if  /tmpB exch def<br>  tmpC <br>  \psk@decimals\space -1 gt <br>    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>    \psk@decimals\space 0 eq { cvi } if  /tmpC exch def<br>

  (y = ) show<br>  tmpA 30 string cvs show<br>  (e) show<br>  0 \psk@fontscale 4 div rmoveto <br>  mfontexp tmpC \psk@valuewidth string cvs show <br>  (\string\(x) show<br>  tmpB 0 ne { tmpB 0 ge { (+) show } if tmpB \psk@valuewidth string cvs show } if<br>

  (\string\)) show<br>  0 \psk@fontscale 4 div rmoveto (2) show mfont<br>  0 \psk@fontscale 2 div neg rmoveto<br>  setYint Yint 0 ne and { Yint 0 gt { (+) show } if Yint \psk@valuewidth string cvs show } if } if<br>  %%%%%%%%%%%%%%%<br>

  % Round Coeff %<br>  %%%%%%%%%%%%%%%<br>  0 1 ai length 1 sub {/ci exch def<br>    ai ci get <br>    \psk@decimals\space -1 gt <br>    { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>    \psk@decimals\space 0 eq { cvi } if <br>

  ai ci 3 -1 roll put } for<br>  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br>  % Plot Polynomial (including Linear) Fit %<br>  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%<br>  PolyEq { (y =) show <br>  1 1 m { /ci exch def <br>

          ai ci 1 sub get 30 string cvs show<br>          ci 1 sub 0 gt { xPr } if<br>          ci 1 sub 1 gt {%<br>             0 \psk@fontscale 4 div rmoveto ci 1 sub 30 string cvs show <br>             0 \psk@fontscale 4 div neg rmoveto } if  <br>

          ci m eq not { ai ci get 0 lt {}{ (+) show } ifelse } if<br>  } for } if<br>  %Print Rsquared<br>  rsquared<br>  \psk@decimals\space -1 gt <br>  { 10 \psk@decimals exp dup 3 1 roll mul round exch div } if<br>  \psk@decimals\space 0 eq { cvi } if  /rsquared exch def<br>

  \psk@EqPos\space PLU moveto<br>  0 \psk@fontscale 1.5 mul neg rmoveto <br>  (R) show<br>  0 \psk@fontscale 2 div rmoveto<br>  mfontexp (2) show mfont<br>  0 \psk@fontscale 2 div neg rmoveto<br>  ( = ) show<br>  rsquared \psk@valuewidth string cvs show<br>

  \fi  <br>} <br>%<br>\def\tx@GaussSolve{GaussSolve }<br>\pst@def{GaussSolve}<{%<br>%Required Variables<br>%order,A,B,ai<br>  /er 1 def  %<br>  /tol 0.00001 def %<br>  /m order 1 add def %number of equations<br>  /elem { exch 1 sub m mul add 1 sub } def %Array i j<br>

  %DETERMINE SCALE FACTORS<br>  /sc m array def %row scale factors<br>  0 1 sc length 1 sub { sc exch 0 put } for<br>  1 1 m { /ci exch def <br>    sc<br>    ci 1 sub<br>    A ci 1 elem get <br>    dup mul sqrt <br>    put<br>

    2 1 m { /cj exch def<br>      A ci cj elem get<br>      dup mul sqrt<br>      sc ci 1 sub get gt {%<br>      sc<br>      ci 1 sub<br>      A ci cj elem get<br>      dup mul sqrt<br>      put } if <br>    } for<br>  % 1 ci mul 1 sc ci 1 sub get 30 string cvs show<br>

  } for <br>  %END OF SCALE FACTORS<br>  %CALL ELIMINATE<br>  order 1 ge {%<br>  1 1 m 1 sub { /ck exch def<br>    %Call Pivot<br>    /p ck def<br>    A ck ck elem get<br>    sc ck 1 sub get div<br>    dup mul sqrt<br>    /big exch def<br>

    ck 1 add 1 m {/cii exch def<br>      A cii ck elem get<br>      sc cii 1 sub get div<br>      dup mul sqrt<br>      /dummy exch def<br>      dummy big gt { /big dummy def /p cii def } if<br>    } for<br>    p ck eq not { <br>

    ck 1 m {/cjj exch def<br>      A p cjj elem get<br>      /dummy exch def<br>      A p cjj elem<br>      A ck cjj elem get<br>      put<br>      A ck cjj elem<br>      dummy<br>      put<br>    } for<br>    B p 1 sub get<br>

    /dummy exch def<br>    B p 1 sub <br>    B ck 1 sub get<br>    put<br>    B ck 1 sub <br>    dummy<br>    put<br>    sc p 1 sub get<br>    /dummy exch def<br>    sc p 1 sub <br>    sc ck 1 sub get<br>    put<br>    sc ck 1 sub <br>

    dummy<br>    put<br>    } if  <br>    %End Pivot<br>    %Back to Eliminate<br>    A ck ck elem get <br>    sc ck 1 sub get div<br>    dup mul sqrt tol lt { /er -1 def } if<br>    ck 1 add 1 m { /ci exch def <br>      A ci ck elem get<br>

      A ck ck elem get div<br>      /factor exch def<br>      %ck 1 add 1 m { /cj exch def <br>      1 1 m { /cj exch def  %Line Changed from above, requires more calcs but allows debugging of matrix ops.<br>        A ci cj elem %index<br>

        A ci cj elem get<br>        A ck cj elem get<br>        factor <br>        mul sub %value<br>        put<br>      } for<br>      B ci 1 sub %index<br>      B ci 1 sub get <br>      B ck 1 sub get<br>      factor <br>

      mul sub %value<br>      put<br>    } for<br>  } for<br>    \Pst@Debug\space 1 eq {<br>    A [ order 1 add order 1 add praXr praYt 0.5 false false ] PRA<br>    B [ order 1 add 1 praXr praYt 0.5 false true ] PRA<br>  } if <br>

  } if<br>  %Start Back Substitution<br>  %Add Error check for er -1<br>  ai m 1 sub<br>  B m 1 sub get<br>  A m m elem get<br>  div put<br>  order 1 ge {%<br>  m 1 sub -1 1 { /ci exch def<br>    /sum 0 def<br>    ci 1 add 1 m { /cj exch def<br>

      A ci cj elem get<br>      ai cj 1 sub get<br>      mul sum add<br>      /sum exch def<br>    } for<br>    ai ci 1 sub<br>    B ci 1 sub get<br>    sum sub<br>    A ci ci elem get<br>    div put<br>  } for<br>  A ck ck elem get<br>

  sc ck 1 sub get div<br>  dup mul sqrt tol lt { /er -1 def } if <br>  } if }><br><br>\makeatother<br><br>\begin{document}<br>\pagestyle{empty}<br>\pagenumbering{arabic}<br>%<br>\readdata[ignoreLines=0]{\Gauss}{gauss.dat}<br>

\readdata[ignoreLines=0]{\Power}{power.dat}<br>\readdata[ignoreLines=0]{\King}{king.dat}<br>\readdata[ignoreLines=0]{\Exp}{exp.dat}<br>\readdata[ignoreLines=0]{\Linear}{linear.dat}<br>\readdata[ignoreLines=0]{\LinearA}{linearA.dat}<br>

\readdata[ignoreLines=0]{\Recip}{recip.dat}<br>\readdata[ignoreLines=0]{\Poly}{poly.dat}<br>\readdata[ignoreLines=0]{\Logt}{logt.dat}<br>\readdata[ignoreLines=0]{\Loge}{loge.dat}<br>%<br>%<br>\psset{xAxisLabel=x, %Setup for psgraph env<br>

        yAxisLabel=y,<br>        xAxisLabelPos=,<br>        yAxisLabelPos=}<br>\psset{xunit=1,yunit=1}<br><br>%Fit of Linear Function<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=2,xsubticks=1,ysubticks=1](0,0)(0,0)(10,30){4.5in}{4.5in}<br>

\listplot[decimals=2,EqPos=5 15,plotstyle=GLLSR]{\Linear}<br>\listplot[plotstyle=dots]{\Linear}<br>\end{psgraph}<br>\end{figure}<br><br>%Fit of Power Function<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=50,xsubticks=1,ysubticks=1](0,0)(0,0)(10,1000){4.5in}{4.5in}<br>

\listplot[decimals=2,EqPos=1 800,plotstyle=GLLSR,PowerFit]{\Power}<br>\listplot[plotstyle=dots]{\Power}<br>%\listplot[EqPos=5 4,plotstyle=GLLSR,CustomFit,CheckZeroX=true,CheckZeroY=true,FYtrans=log,RYtrans=10 exch %exp,FXtrans=log]{\Power}<br>

\end{psgraph}<br>\end{figure}<br><br>%Fit of exp Function<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=1000,xsubticks=1,ysubticks=1](0,0)(0,0)(10,10000){4.5in}{4.5in}<br>\listplot[PstDebug=1,decimals=2,EqPos=1 800,plotstyle=GLLSR,ExpFit]{\Exp}<br>

\listplot[plotstyle=dots]{\Exp}<br>\end{psgraph}<br>\end{figure}<br><br>%Fit of Log10/Loge Functions<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=2,xsubticks=1,ysubticks=1](0,0)(0,0)(10,50){4.5in}{4.5in}<br>

\listplot[decimals=2,EqPos=5 10,plotstyle=GLLSR,LogTFit]{\Logt}<br>\listplot[decimals=2,plotstyle=dots]{\Logt}<br>\listplot[decimals=2,EqPos=5 28,plotstyle=GLLSR,LogEFit]{\Loge}<br>\listplot[decimals=2,plotstyle=dots]{\Loge}<br>

%\listplot[EqPos=5 4,plotstyle=GLLSR,CustomFit,CheckZeroX=true,CheckZeroY=true,FYtrans=Yint dup mul sub %log,RYtrans=10 exch exp Yint dup mul add,FXtrans=log]{\Linear}<br>\end{psgraph}<br>\end{figure}<br><br>%Fit of Recip<br>

\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=<->,Dx=1,Dy=10,xsubticks=1,ysubticks=1](0,0)(0,0)(10,100){4.5in}{4.5in}<br>\listplot[decimals=2,EqPos=5 2,plotstyle=GLLSR,RecipFit]{\Recip}<br>\listplot[plotstyle=dots]{\Recip}<br>

\end{psgraph}<br>\end{figure}<br><br>%Fit of Kings Law data<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=1,xsubticks=1,ysubticks=1](0,0)(0,0)(10,20){4.5in}{4.5in}<br>\pstScalePoints(1,1){}{dup mul}<br>

\listplot[decimals=2,EqPos=5 2,plotstyle=GLLSR,PowerFit,Yint=5]{\King}<br>\listplot[plotstyle=dots]{\King}<br>\pstScalePoints(1,1){}{}<br>\end{psgraph}<br>\end{figure}<br><br>%Fit of Guassian<br>\begin{figure}<br>\centering<br>

\begin{psgraph}[arrows=->,Dx=1,Dy=0.1,xsubticks=1,ysubticks=1](0,0)(-10,0)(10,1){4.5in}{4.5in}<br>\listplot[plotstyle=dots]{\Gauss}<br>\listplot[decimals=2,EqPos=5 0.4,plotstyle=GLLSR,GaussFit,plotpoints=400]{\Gauss}<br>

\end{psgraph}<br>\end{figure}<br><br>%Fit of 4th Order Polynomial<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=100,xsubticks=1,ysubticks=1](0,0)(0,-600)(10,600){4.5in}{4.5in}<br>\listplot[plotstyle=dots]{\Poly}<br>

\listplot[decimals=2,EqPos=0.5 -200,plotstyle=GLLSR,PolyOrder=4,plotpoints=400]{\Poly}<br>\end{psgraph}<br>\end{figure}<br><br>%LinetoXAxis respests scalepoints.<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=<->,Dx=1,Dy=1,xsubticks=1,ysubticks=1](0,0)(0,0)(10,10){4in}{4in}<br>

\pstScalePoints(0.5,0.25){2 add}{16 add}<br>\listplot[plotstyle=line]{\Linear}<br>\listplot[arrows=<-,plotstyle=LineToXAxis]{\Linear}<br>\pstScalePoints(1,1){}{}<br>\rput[lb](1,2){Scaled fluid velocity distribution on a plot of the physical system.}<br>

\end{psgraph}<br>\end{figure}<br><br>%Prepare Points Modification<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=1,xsubticks=1,ysubticks=1](0,0)(0,0)(15,30){4.5in}{4.5in}<br>\listplot[plotstyle=line,plotNoMax=2,plotNo=1]{\LinearA}<br>

\listplot[plotstyle=line,plotNoMax=2,plotNo=2]{\LinearA}<br>\listplot[plotstyle=line,linestyle=dashed,plotNoMax=2,plotNo=1,plotNoTwo=2,plotNoTwoFunc=add 2 div]{\LinearA}<br>\rput[lb](10,18){1st Column}<br>\rput[lb](10,29){2nd Column}<br>

\rput[lb](10,24){Average of 1st and 2nd Columns}<br>\end{psgraph}<br>\end{figure}<br><br>%PrintCoor Demo<br>\begin{figure}<br>\centering<br>\begin{psgraph}[arrows=->,Dx=1,Dy=1,xsubticks=1,ysubticks=1](0,0)(0,0)(10,15){4.5in}{4.5in}<br>

%PrintCoor Demo<br>\psset{xEnd=,xStart=,decimals=2,valuewidth=50,fontscale=10,PstDebug=1}<br>\pstScalePoints(1,1){0.75 mul}{0.5 exp 3 mul}<br>\listplot[plotstyle=PrintCoor,plotNoMax=1,plotNo=1,PstDebug=0,relxerr=0,relyerr=0.1]{\Linear}<br>

\listplot[plotstyle=dots,plotNoMax=1,plotNo=1]{\Linear}<br>\pstScalePoints(1,1){}{}<br>\end{psgraph}<br>\end{figure}<br>\end{document}</div>