home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tiger Disk 53
/
Tiger_Disk_053_1998-08_Tiger-Crew-Disk_de_Side_B.d64
/
gauss-jordan
(
.txt
)
< prev
next >
Wrap
Commodore BASIC
|
2023-02-26
|
4KB
|
179 lines
5 poke 53280,15:poke 53281,12:print""
10 rem simultane loesung linearer gleichungen
11 rem mit hilfe der gauss-jordan-elimination
12 rem variablen
14 rem c1 loesungsvektor
15 rem e1 fehleranzeige
16 rem m1 maximale laenge
17 rem n1 anzahl der zeilen
18 rem n2 anzahl der spalten
19 rem i2 hilfsmatrix
20 rem ende der variablen
30 rem
70 m1=8
80 dim z(8),a(8,8),c1(8),w(8,1),b(8,8),i2(8,3)
90 print"[147]simultane loesung mit hilfe"
100 print"der gauss-jordan-elimination"
110 gosub 500:rem eingabe-routine
120 gosub 5000:rem gauss-jordan-routine
130 rem
140 if n1>5 then 220
150 print"[153] matrix-konstanten"
155 print
160 for i=1 to n1
170 : for j=1 to n2
180 : printtab(10)a(i,j);
190 : next j
200 : printtab(25)z(i)
210 next i
220 print""
230 if e1=1 then printtab(6)"[158]fehler: matrix singulaer":goto 300
240 print"[144] loesung"
250 print
260 for i=1 to n2
270 : printtab(10)int(c1(i)*100+.5)/100;
280 next i
290 print""
300 goto 9999
500 rem eingabe der daten
530 print
540 input"[159]anzahl der gleichungen:";n1
545 print""
550 if n1>m1 then 540
560 if n1<2 then 9999
570 n2=n1
580 for i=1 to n1
590 : print"gleichung";i
600 : for j=1 to n1
610 : printtab(20)j;" ";
620 : input a(i,j)
630 : next j
640 : input" c ";z(i)
650 next i
660 return
5000 rem gauss-jordan matrix-inversion und loesung
5011 rem variablen
5013 rem a koeffizientenmatrix
5014 rem b hilfsarray
5015 rem b1 groesster wert
5016 rem c1 loesungsvektor
5017 rem d3 determinantee
5018 rem e1 fehleranzeige
5019 rem h1 hilfsvariable
5020 rem i2 hilfsmatrix
5021 rem i3 zeilenindex
5022 rem i4 spaltenindex
5023 rem i5 anzeige fuer inverses drucken
5024 rem n2 anzahl dr spalten
5025 rem n3 anzahl der konstantenvektoren
5026 rem p1 pivot-index
5027 rem w loesungsmatrix
5028 rem z konstantenvektor
5029 rem ende der variablen
5080 rem
5090 e1=0:rem wird 1 gesetzt,falls die matrix singulaer ist
5100 i5=0:rem falls 0,drucke die inverse matrix
5110 n3=1:rem anzahl der konstantenvektoren
5120 fori=1ton2
5130 : forj=1ton2
5140 : b(i,j)=a(i,j)
5150 : nextj
5160 : w(i,1)=z(i)
5170 : i2(i,3)=0
5180 : next i
5190 : d3=1
5200 : fori=1ton2
5210 : rem
5220 : rem suche nach dem groessten (pivot-)element
5230 : rem
5240 : b1=0
5250 : forj=1ton2
5260 : if(i2(j,3)=1)then5350
5270 : fork=1ton2
5280 : if(i2(k,3)>1)then6120
5290 : if(i2(k,3)=1)then5340
5300 : if(b1>=abs(b(j,k)))then5340
5310 : i3=j
5320 : i4=k
5330 : b1=abs(b(j,k))
5340 : nextk
5350 : nextj
5360 : i2(i4,3)=i2(i4,3)+1
5370 : i2(i,1)=i3
5380 : i2(i,2)=i4
5390 : rem zeilenvertauschung,um das pivot-element in die diagonale zu bringen
5400 : if(i3=i4)then5540
5410 : d3=-d3
5420 : forl=1ton2
5430 : h1=b(i3,l)
5440 : b(i3,l)=b(i4,l)
5450 : b(i4,l)=h1
5460 : nextl
5470 : if(n3<1)then5540
5480 : forl=1ton3
5490 : h1=w(i3,l)
5500 : w(i3,l)=e(i4,l)
5510 : w(i4,l)=h1
5520 : nextl
5530 : rem division von pivot-zeile durch pivot-element
5540 : p1=b(i4,i4)
5550 : d3=d3*p1
5560 : b(i4,i4)=1
5570 : forl=1ton2
5580 : b(i4,l)=b(i4,l)/p1
5590 : nextl
5600 : if(n3<1)then5660
5610 : forl=1ton3
5620 : w(i4,l)=w(i4,l)/p1
5630 : nextl
5640 : rem
5650 : rem reduziere nicht-pivot-zeile
5660 : forl1=1ton2
5670 : if(l1=i4)then5770
5680 : t=b(l1,i4)
5690 : b(l1,i4)=0
5700 : forl=1ton2
5710 : b(l1,l)=b(l1,l)-b(i4,l)*t
5720 : nextl
5730 : if(n3<1)then5770
5740 : forl=1ton3
5750 : w(l1,l)=w(l1,l)-w(i4,l)*t
5760 : nextl
5770 :nextl1
5780 nexti
5790 rem
5800 rem spaltenvertauschung
5810 rem
5820 fori=1ton2
5830 : l=n2-i+1
5840 : if(i2(l,1)=i2(l,2))then5920
5850 : i3=i2(l,1)
5860 : i4=i2(l,2)
5870 : fork=1ton2
5880 : h1=b(k,i3)
5890 : b(k,i3)=b(k,i4)
5900 : b(k,i4)=h1
5910 : nextk
5920 nexti
5930 fork=1ton2
5940 : if(i2(k,3)<>1)then6120
5950 nextk
5960 e1=0
5970 fori=1ton2
5980 : c1(i)=w(i,1)
5990 nexti
6000 if(i5=1)then6140
6020 print"[147][158]inverse matrix":print
6030 fori=1ton2
6040 : forj=1ton2
6050 : printtab(11)int(b(i,j)*100+.5)/100;
6060 : nextj
6070 : print
6080 nexti
6090 print""
6100 print"determinante=";d3
6110 return:rem falls die inverse gedruckt wird
6120 e1=1
6140 return:rem ende des gauss-jordan-unterprogramms
9999 end