%!PS % Gauss-Jordan linear equation solver upgrade % =========================================== % by Don Lancaster % Copyright c 2003 by Don Lancaster & Synergetics, Box 809, Thatcher, AZ, 85552 % (928) 428-4073 Email: don@tinaja.com Website: http://www.tinaja.com % Consulting services available http://www.tinaja.com/info01.html % All commercial rights and all electronic media rights ~fully~ reserved. % Linking usually welcome. Reposting expressly forbidden. Version 1.9 % PostScript-as-language code that attempts to clean up solving n linear % equations in n unknowns. % Modify data in editor or wp. Then send to distiller. % Additional tutorial info at http://www.tinaja.com/gurgrm01.asp % ========= % This file requires the previous download of gonzo.psl % available from https://www.tinaja.com/pssamp1.shtml % Make sure the following line agrees with your own gonzo.psl location (C:/Users/don/Desktop/gonzo/gonzo.psl) run % use internal gonzo % ========== /guru { gonzo begin ps.util.1 begin printerror nuisance begin} def guru % activate gonzo utilities [/CropBox [0 0 400 400] % set the wierd size /PAGES pdfmark [ {Catalog} << /ViewerPreferences << /FitWindow true /CenterWindow true >> /PageLayout /OneColumn % continous /Pagemode /UseNone % no thumbs /View [/XYZ null null 1 ] % force 100% >> /PUT pdfmark % input data to be in form of 2n point matrix [ 0,0 x,y ..... 1,1] % data points should be in ascending order. /solvelineq { /order data length 2 div floor cvi 1 sub store % calculate order % create x arrays /xarray mark order -1 1 {/curdat exch store data curdat 2 mul get /curx exch store mark order -1 1 {curx exch exp} for ] } for ] store /yarray mark order -1 1 { 2 mul 1 add data exch get } for ] store data == xarray == yarray == { [{error} {solve2x2} {solve3x3} {solve4x4} {solve5x5} {solve6x6} {solve7x7} {solve8x8} {solve9x9}] order 1 sub get exec % do order specific solution } pop autogen % create code module for specific XxX solution exec } store % end solvelineq %%%%%%%%%%% /zeroify {/rowpos exch store /row exch store /sourcerow exch store /curmul xarray row get rowpos get store rowpos 1 order 1 sub {/xxx exch store xarray sourcerow get xxx get curmul mul xarray row get xxx get exch sub xarray row get exch xxx exch put } for yarray sourcerow get curmul mul yarray row get exch sub yarray exch row exch put xarray == yarray == } def /unify { /rowpos exch store /row exch store /curdiv xarray row get rowpos get store xarray row get rowpos 1.0000 put rowpos 1 add 1 order 1 sub {/xxx exch store xarray row get dup xxx get curdiv div xxx exch put } for yarray row get curdiv div yarray exch row exch put xarray == yarray == } store /jordanify {/rowpos exch store /row exch store /altrow exch store xarray row get rowpos get % get value to be converted to 1 yarray altrow get mul % get value to be scaled yarray row get exch sub % get value to be subtraced from yarray exch row exch put xarray row get rowpos 0 put % force 1 instead of subtracting xarray == yarray == } store /solve4x4 { 0 1 0 zeroify 1 1 unify 0 2 0 zeroify 1 2 1 zeroify 2 2 unify 0 3 0 zeroify 1 3 1 zeroify 2 3 2 zeroify 3 3 unify 3 2 3 jordanify % altrow row rowpos 3 1 3 jordanify 3 0 3 jordanify 2 1 2 jordanify 2 0 2 jordanify 1 0 1 jordanify } def /solve5x5 { 0 1 0 zeroify 0 2 0 zeroify 0 3 0 zeroify 0 4 0 zeroify 1 1 unify 1 2 1 zeroify 1 3 1 zeroify 1 4 1 zeroify 2 2 unify 2 3 2 zeroify 2 4 2 zeroify 3 3 unify 3 4 3 zeroify 4 4 unify 4 3 4 jordanify % altrow row rowpos 4 2 4 jordanify 4 1 4 jordanify 4 0 4 jordanify 3 2 3 jordanify 3 1 3 jordanify 3 0 3 jordanify 2 1 2 jordanify 2 0 2 jordanify 1 0 1 jordanify } def % autogen makes a proc that solves a specific order /autogen { mark 0 1 order 1 sub { /ii exch store % save current index ii dup /unify cvx ii 1 add 1 order 1 sub {/jj exch store % running index to zero column ii jj ii /zeroify cvx } for % zeroify only } for % complete unify and zeroify order 1 sub -1 1 {/mm exch store % jordanify column mm 1 sub -1 0 {/nn exch store mm nn mm /jordanify cvx } for % do jordanify column } for % do jordanify full ] cvx % convert array to proc } def /solve6x6 { 0 1 0 zeroify 0 2 0 zeroify 0 3 0 zeroify 0 4 0 zeroify 0 5 0 zeroify 1 1 unify 1 2 1 zeroify 1 3 1 zeroify 1 4 1 zeroify 1 5 1 zeroify 2 2 unify 2 3 2 zeroify 2 4 2 zeroify 2 5 2 zeroify 3 3 unify 3 4 3 zeroify 3 5 3 zeroify 4 4 unify 4 5 4 zeroify 5 5 unify 5 4 5 jordanify % altrow row rowpos 5 3 5 jordanify 5 2 5 jordanify 5 1 5 jordanify 5 0 5 jordanify 4 3 4 jordanify 4 2 4 jordanify 4 1 4 jordanify 4 0 4 jordanify 3 2 3 jordanify 3 1 3 jordanify 3 0 3 jordanify 2 1 2 jordanify 2 0 2 jordanify 1 0 1 jordanify } def %%%%%%%%%%%%% /solve7x7 { 0 1 0 zeroify 0 2 0 zeroify 0 3 0 zeroify 0 4 0 zeroify 0 5 0 zeroify 0 6 0 zeroify 1 1 unify 1 2 1 zeroify 1 3 1 zeroify 1 4 1 zeroify 1 5 1 zeroify 1 6 1 zeroify 2 2 unify 2 3 2 zeroify 2 4 2 zeroify 2 5 2 zeroify 2 6 2 zeroify 3 3 unify 3 4 3 zeroify 3 5 3 zeroify 3 6 3 zeroify 4 4 unify 4 5 4 zeroify 4 6 4 zeroify 5 5 unify 5 6 5 zeroify 6 6 unify 6 5 6 jordanify % altrow row rowpos 6 4 6 jordanify 6 3 6 jordanify 6 2 6 jordanify 6 1 6 jordanify 6 0 6 jordanify 5 4 5 jordanify 5 3 5 jordanify 5 2 5 jordanify 5 1 5 jordanify 5 0 5 jordanify 4 3 4 jordanify 4 2 4 jordanify 4 1 4 jordanify 4 0 4 jordanify 3 2 3 jordanify 3 1 3 jordanify 3 0 3 jordanify 2 1 2 jordanify 2 0 2 jordanify 1 0 1 jordanify } def %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%% /solve8x8 { 0 1 0 zeroify 0 2 0 zeroify 0 3 0 zeroify 0 4 0 zeroify 0 5 0 zeroify 0 6 0 zeroify 0 7 0 zeroify 1 1 unify 1 2 1 zeroify 1 3 1 zeroify 1 4 1 zeroify 1 5 1 zeroify 1 6 1 zeroify 1 7 1 zeroify 2 2 unify 2 3 2 zeroify 2 4 2 zeroify 2 5 2 zeroify 2 6 2 zeroify 2 7 2 zeroify 3 3 unify 3 4 3 zeroify 3 5 3 zeroify 3 6 3 zeroify 3 7 3 zeroify 4 4 unify 4 5 4 zeroify 4 6 4 zeroify 4 7 4 zeroify 5 5 unify 5 6 5 zeroify 5 7 5 zeroify 6 6 unify 6 7 6 zeroify 7 7 unify 7 6 7 jordanify % altrow row rowpos 7 5 7 jordanify 7 4 7 jordanify 7 3 7 jordanify 7 2 7 jordanify 7 1 7 jordanify 7 0 7 jordanify 6 5 6 jordanify 6 4 6 jordanify 6 3 6 jordanify 6 2 6 jordanify 6 1 6 jordanify 6 0 6 jordanify 5 4 5 jordanify 5 3 5 jordanify 5 2 5 jordanify 5 1 5 jordanify 5 0 5 jordanify 4 3 4 jordanify 4 2 4 jordanify 4 1 4 jordanify 4 0 4 jordanify 3 2 3 jordanify 3 1 3 jordanify 3 0 3 jordanify 2 1 2 jordanify 2 0 2 jordanify 1 0 1 jordanify } def %%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%% /solve9x9 { 0 1 0 zeroify 0 2 0 zeroify 0 3 0 zeroify 0 4 0 zeroify 0 5 0 zeroify 0 6 0 zeroify 0 7 0 zeroify 0 8 0 zeroify 1 1 unify 1 2 1 zeroify 1 3 1 zeroify 1 4 1 zeroify 1 5 1 zeroify 1 6 1 zeroify 1 7 1 zeroify 1 8 1 zeroify 2 2 unify 2 3 2 zeroify 2 4 2 zeroify 2 5 2 zeroify 2 6 2 zeroify 2 7 2 zeroify 2 8 2 zeroify 3 3 unify 3 4 3 zeroify 3 5 3 zeroify 3 6 3 zeroify 3 7 3 zeroify 3 8 3 zeroify 4 4 unify 4 5 4 zeroify 4 6 4 zeroify 4 7 4 zeroify 4 8 4 zeroify 5 5 unify 5 6 5 zeroify 5 7 5 zeroify 5 8 5 zeroify 6 6 unify 6 7 6 zeroify 6 8 6 zeroify 7 7 unify 7 8 7 zeroify 8 8 unify 8 7 8 jordanify % altrow row rowpos 8 6 8 jordanify 8 5 8 jordanify 8 4 8 jordanify 8 3 8 jordanify 8 2 8 jordanify 8 1 8 jordanify 8 0 8 jordanify 7 6 7 jordanify 7 5 7 jordanify 7 4 7 jordanify 7 3 7 jordanify 7 2 7 jordanify 7 1 7 jordanify 7 0 7 jordanify 6 5 6 jordanify 6 4 6 jordanify 6 3 6 jordanify 6 2 6 jordanify 6 1 6 jordanify 6 0 6 jordanify 5 4 5 jordanify 5 3 5 jordanify 5 2 5 jordanify 5 1 5 jordanify 5 0 5 jordanify 4 3 4 jordanify 4 2 4 jordanify 4 1 4 jordanify 4 0 4 jordanify 3 2 3 jordanify 3 1 3 jordanify 3 0 3 jordanify 2 1 2 jordanify 2 0 2 jordanify 1 0 1 jordanify } def %%%%%%%%%%%%%%%%%%%%%%% /solve2x2 { 0 1 0 zeroify 1 1 unify 1 0 1 jordanify xarray == yarray == } store /solve3x3 { 0 1 0 zeroify 0 2 0 zeroify 1 1 unify 1 2 1 zeroify 2 2 unify 2 1 2 jordanify 2 0 2 jordanify 1 0 1 jordanify } store % plotter all %%%%%%%%% plotter /plotit { 100 100 10 setgrid 20 20 showgrid 0 1 order { /dposn exch store data dposn 2 mul get 20 mul data dposn 2 mul 1 add get 20 mul moveto dot } for line2 0 0 moveto 1 setlinejoin 1 setlinecap 0 0.002 1.001 { /xx exch store xx 20 mul % position 0 0 1 yarray length 1 sub {/ii exch store xx order ii sub exp % x to the n yarray ii get mul % times coeff add % for all terms } for 20 mul lineto } for stroke showpage } store %%%%%%%%% temp 2 plotter /plotitx { 100 100 10 setgrid 20 20 showgrid 0 1 order { /dposn exch store data dposn 2 mul get 20 mul data dposn 2 mul 1 add get 20 mul moveto dot } for line2 0 0 moveto 0 0.01 1 { /xx exch store xx 20 mul xx dup mul aa mul xx bb mul add 20 mul lineto } for stroke showpage } store %%%%%%%%%%%% %%%%%%%%%%%%%%% Demo - Remove or alter before reuse %%%%%%%%%%%%% % data points should be monotonic and in ascending order... /data [ 0 0 0.5 0.7 1 1 ] store solvelineq plotit /data [ 0 0 0.2 0.1 0.7 0.8 1 1 ] store solvelineq plotit /data [ 0 0 0.2 0.1 0.4 0.3 0.7 0.8 1 1 ] store solvelineq plotit /data [ 0 0 0.1 0.25 0.2 0.1 0.4 0.3 0.7 0.8 1 1 ] store solvelineq plotit /data [ 0 0 0.1 0.25 0.2 0.1 0.4 0.3 0.5 0.3 0.8 0.3 1 1 ] store solvelineq plotit /data [ 0 0 0.1 0.25 0.2 0.1 0.4 0.3 0.5 0.3 0.65 0.5 0.8 0.55 1 1 ] store solvelineq plotit /data [ 0 0 0.1 0.25 0.2 0.1 0.3 0.2 0.4 0.3 0.5 0.3 0.65 0.5 0.8 0.75 1 1 ] store solvelineq plotit /data [ 0 0 0.05 0.2 0.1 0.2 0.2 0.1 0.3 0.2 0.4 0.3 0.5 0.3 0.65 0.5 0.8 0.65 1 1 ] store solvelineq plotit /data [ 0 0 0.1 .5 0.2 .5 0.3 .5 0.4 .5 0.5 .5 0.6 .6 0.7 .5 0.8 .5 0.9 .5 1 1 ] store solvelineq plotit showpage % EOF