From 367021d2d5fbfdf5ca062f5f11da433e6d1139e7 Mon Sep 17 00:00:00 2001 From: Siphalor Date: Sat, 15 Feb 2020 20:02:41 +0100 Subject: [PATCH] =?UTF-8?q?Finish=20=EF=BF=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.bat | 2 +- build.sh | 1 + main | Bin 0 -> 28408 bytes main.c | 163 ++++++++++++++++++++++++++++++++++++++++++++---------- 4 files changed, 137 insertions(+), 29 deletions(-) create mode 100644 build.sh create mode 100644 main diff --git a/build.bat b/build.bat index cebd95d..4d9109d 100644 --- a/build.bat +++ b/build.bat @@ -1,3 +1,3 @@ @echo off -gcc -Wall -g -std=c99 %1.c -o %1.exe +gcc -Wall -g -lm -std=c99 main.c -o main.exe @echo on diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..2a4c4fa --- /dev/null +++ b/build.sh @@ -0,0 +1 @@ +gcc -Wall -g -std=c99 -lm main.c -o main diff --git a/main b/main new file mode 100644 index 0000000000000000000000000000000000000000..45ce19718683deb48462a67e8034e6503fc1d9bc GIT binary patch literal 28408 zcmeHwe|%KcweLQ2vXhzom?VTB2|sj1Kx`oiDhSGt1Q?hgXey#m)M1j$B%_m=yqPon z@QNUj>NKX8*jq2Hv_|{6K5n%ww?BMT+X`w0`+Q#Pvz2?RebJ}wq|l0rnpSk)ckLgO zGedIU=e|Gg=Y8%cTXWW4Yp=ET+H0@9&)Mhf+3fPJUF9$grjyB*GQt`vC8a?X3GA)Wh;%7dZe)L%SRmom?V{*~xXe@Pumjkb+u{P?Ae4xwMkg z@QiYVhT5Ox6Z(5z>C1;JQASBa;-%F5j@3r_hRX$d9y}n)OhYaA1<0wUD~^8~Xt!Ul z>Kn~3vz7fCs^+q~NVsLe6?Kuexsh-*xqa^Tg$w2`xS}=@tG!ILoAeX!>T5R$Lnywq zYsu#E_#+yXfBzeAzPIax`~FL6^FRKtO5?f1Cw`h*OuQ5DM><5ijJuIz4x&xO-z&kF zI~Tp*qr;KPa?<<2#^q2XVvRyC0o@~6a<0w5M$+@(DD*o=p?`N2`Y%VJ-#ZGOyfBhI z1EbKtG7A00QRtU|?!jMvdJKe->iy9ubpI%HnzlyL^Xw?}1)zKIm!Dn%VR}9h_|y2S zWHsyvbsUl&j|}nJN#VJG`I~N7=Wh$fgYDsj6^!4oZbc*(4c-uFi3FM7-`*LE`V&?l zZu$L^bwtKcXJ9+&Y?V4gv94eg(&0p`bsupUuy^BAdMu9&(6rX=2n;&i)_G(1cTo z<})xN4PZ3BJ@`vb4r7Kl*~iFJGLWYcPvw;UuJ1t%U(QSj5p7a9Tt+jaTj5gPk(Jl; zvhFvJ3YGyi?`ryhx*zuE^|QuLUMH#-a|g{cIt|$9H0E_m+vsjh1UzG-)10N#kd01r zl1@7A=-x*2lup&k&LR-Ve>!<=bn>!Jvu$)e$5UCojV|t=N?@UlZodyS*yvQZPCgr5 z`;^L>ZFF_(79tyM^kS_9aEpyzYNL19=;-il>ax+xvsA{m+vpWG`feLtb-5_L&qlY; zC;M#lDx03M?3f3}JTT^gF%OJ+;Qwb2__|L!eLeh*WsLdu9Ag8gC_+3E5hl~V(^H-e@Qq!5)B>___Ku5BgSCA zz@H+V9xVp<3H%3y(<8;;Zh?P?aC(#&>=O8+gwrF$;1+>@gK&Cu7;F~!1BBBf!(fBJ zzf3qidJWbKd=KID=rHIJ_#K4PBg0^Yz~h9|BiSGm_-%yKqr>2t&p?>@>{7-;`+$oy z?@vvsS8nyC-tu+7eWv+_wY~g1koEPJtq@?zQE+7@Y=z9(@(Wi|$&z_c=G1j;cim=oPyvt1poZM63?Zd`Hp^O`ch|nN7KuE#tXhzKC{L{!AzyV znHdO)dbIrRC2yjLCF?f$x|bAE)|Yz6D)sd&c@#)`E?SiCz~u%06X3=zT28~kzd_*! z$oTF)y`_S&)X$!HH{d0;$sI#b&Wzck3gk}x+)4LEw>D>qoU&@sfcw*Rx^3*ON?VEj*U~7liaZN6PQ{6#AflG3l?PM)Y{o)WS6B z?On2(=#wOUfaq_K_TD9nh@Lqo_)il37m_}Q=zjn`eHnyO-l6WDLz(h>W}-Ia>a9Xt z=OqifJBR8|tw6q5P*`$;*7-POk9mj4@>A2{j8ltIADrqsjowD_x+bSC-#Mo^{y|AL~F_toy5ufmXr(Ol#V>ymT>1|=%^vZ??eTfqgS@)gLPdVJse zDnt=b*>HcL67wK1fu`!6Kd^Q z>eEyH?wx1bk{9%N&-(WJjt&&~dYjLnH;(&^6Xf7FbjYd3;nLKzs<4OcJu)g?TT-Jb0C&Uq)qA5qWB3E~=Xsh~^FgWegW7h#O1XCvbgRFJ-%l&Dt4{(@QMFJh>?`k4^> z(;~*6qVRw{eRg}^2CEiZNMg@ItOrq^Hd5XbJsVD-@L=jU)W{d%LrLhDgu_JeoKuK7uV>w9 zU+as$qi>qN-lb3MbGCO6WCdse?48QUneaoaE?{W5QcojwHZ86CfL2t_YQuof6 zSb1tLs)EsI-y-kn^1VZ3cJGpZfIrjQhcI<_o-oM%9@g7TjyagBz_nka{Q^Ct(L)lY zw)EthAj0Ag9}DLqT7)zBKcg0Mh^!!|op6{B{_qN3W%owdbIhA2&z@R^GS$?yy{W>v zy6IWZ_pAexbeM5mcSE-~ZD2TD?LBel4+f7zX^;1GZ!=oU{~7O}5E#d608+rH>;oZfmD1VTK_6m`H-R`}vKVZxI6;1R$gV{XXlya7ZVyzD(go!jj_2m8-m?S1{O zqQmrLbjl-i!oZuL=RWTzyLWz)v7ERTTaHsb*@*^rRqRWz08h$$u6yUXVyhI_4Bgny zvE=Xf$>|7OTT(k;g7HT%8DUadcL=q54?fe3ft8*QXmb!C_r1&!qx z4n7feBC=G}z4akQofwg!@^_Dr@*ydzLOk^fMq+^&yT&gub7DAt53>~d47%xllcG30 zDMlj3IHr+f-ZRt(gFm4Oh-OYPUd{~1F`P#O!#jX`7;&Du32aBsWApVOj?U(YIpvLP zcmg^h`vU4VQRI6E-Y>uTsL)OKt{yx;(a1l0=eH<(1e4s^Qyu?~%5)p$Jyka{->Ok+ zM?IK2sP^8`tITx^+IJ?W%T)WQUAI!Z;P(+3Z2ggMYhDfHpbyILDqDp2q@nT~gx7}B z*L;x4gnZ?9AnU`TYwK)+2Q{LY(ICZbT2cekfF4=RH_{?~gHxyLX;$ z-BmM!&@t+7ii(rj_^x;c56CPXh6PkP%7(IBL&IDc!$Ya$St^GAQx*D=2FrkB={Z7} z0&&QfYIY6}9uEzDHQrCnKzUk**}37cLYR??OW%jt7|g^&y>{--S2Q~n7o%9<$ba@8 zo;b3W_KDf50?ej!_%`s>=%M=MkBHfF}Z?(2Te@GW{H`A1sYZ@#7R=EhqZ zZ*BBrjmMs&prm&IIjepO)v+|@fiVw^d0@-~V;&guz?cWdJTT^gF%OJ+V9Wz!9vJh$ ze-;lIVz1?JYnmg$KqBY~MzK@XV|4^QT>-1Z6AOuaC>#lTcEpmGw0R=o+k+k}<`Mf) zXI@diXu;-Ni*I3UMJyRn0w}-8ZWHWO4g}>s#)^H*mi)wq=%t(l_rs!5|oNe=jqu8D6nd|AY z`#Io|g(3LBB8$3W*mLWNCOcb#an!Ub0LQnH!gvyT(JR?jqxAY<0!@T(C=IicKRs>a z=1@G=DY~Mz*em)q8r){a50P9s-Xao%BIgu zOfO~|qQUK5=sDOc+X_!$%YM*PFYNPfZw&^~&mQb&4tFLy0Y!f&u&J2BjMP)QuFHZC z0};euJkS|LG$uTOc+k@lBy-Tu^l2DrEvcRvhHX&`yO0x}a3m6Jhg>KYhic)?thYnq z?YiHZ6q_(D5{$N^eW6$~N>)pI$o;2e*r=Nn(A^e@ZsorBUYLBz$FVqSd!koJTQ zypGTKfM?#wWGd)O-|yr{nRftZ1ApNyyrKjA``>3W5x}}XWHR>yZUB4&aQ+`NnU?@J z1D*za0I(GAnLh-a19-=&OlB=$KVSs#HNg7;9j74=xCM}YS8@cf8eb|X={>~89oI8s zdxbHjw8**7D5@YjKI*at*!p>5RB2>>hTr-~{xiQ-ZF5(wa#yb@FWKhY&6Z8R`g51h zm`*B4ekJ}+!WXnjM<=T5X8ipa^}R{9HM%RlPW)|sGn0A6UheHS z&0~T^*xL`Di{Hs)_5)^hIKE0MMEMbrA42&odwD<%Ua!b1&>JTJ3JQ&AqVEUEk=Qz1;0t?yd&^a<^0Ly%(_xJ*aXljd@_q z17jW-^T3z~#ys#J;DPM#*wl}h^gTEq(r@P|Wq(UWTN04;Z>S190>v*JWzxTw!`?cP z^fMlIe2JugHz%H@K+)wNewK+5gHt`1(uQwJ8&w9IdPJ&MDuSjnmC<&eRD9S!DUz-qyD>$3KoqRlDI)NG z)ex)^1g`DC*Li{K--%;ipTM(rEB*h`K>w~hzupBZ4pu36qkoY%PH=*$8^a~f*_OD975Y6Qwif{y8={p2KUEM=y%=!al43yNs} zMuF2boV4CD9Ytv(8->3T82=prFW^|iLxev`3h>9w2WujfzXY9b{{0ln7drc>z$m2c zqLiLF5(K36wsYZOScYZ)QS1+vk# zpV(GTTmrDgMdPtx)%X=aI$X~X;uBVPxoU~6Ng$SM2AQ*_Bmsu)E>6h0an!@RT^|wK zwdFSf+2gvD6kO+Q0;d3KHQxkZ zae~-B?=IO1MTO3VzzUsIP)Z#}c9l_d5VamiNu^-(Q#LJlZ^Kpa?nOrMRx$T|#FcXQ z2@dLPHyuJy_+>$Hx4@Xf9+5`~{gY6>AJFgSnpsW6{IzpOS)maVhFArD$6Dw0dpz9^Xyb+l;SRQIfp#+4EejsDErkk z$=Is+jRWhruC>YV=vsfL*l4<-ME+irtrhydNBUM8We+LFVbAqu^{q5!NqrsTFNY4W zUncE>=RTokE;TBMA*pl>d+sQ7R0~fmGm4cCHi@1tj0(d=uKb#M^ca90l#B!4DnvV8 zC$$yEL<&B$@29(J8VMCgj}(}F2Y1zMCv>qy`*+m@30*}4!0g+ zL-jT?bgI_X%&MkQWhF*oOf_uS884w>6I+>4s_Tld$pI4okW+21sfRS0Cny;Qn(#C; zQOSq1X}~)Anx{N2-SFrl z>Gu7*E92Mc1;zAf7>YyZ@$n+s@^r8QLVi24`j?K;|YaN2q_Czflg`aL)4ao zC91)0fMW{rfeaEi-)!2{$7RB#R$Ms!)U4^{<4dprw)AXD{O+x zYKW=4%CM`hfNH0;FfV1`x9XVRgo>3l&hwxDo0VZvN_9M1I;<|le6;h?j<#O@>7%{ z!t-RvRJ#+1Fijbh<+woAkR@DLob?+$M|prMClPv)Y#FtBdWo@N5@jx?4B~>i0Ffa& zfFnHa#%$?e?;vLwpSa6#73ZAM7^q7o;&h@^U3+V59gdRnFStUTE7cxN)-9|HM_VJw zwjdLH3OS#zC5&@+{_iYx){d@VE+fNPJK<<;D{Q0VcJP(5wgb;aOmHHLc>;&|BwH>2 zs;0GG5HQw;bC3wfK*Stsg*$^X$M|&Sa_AYwtTlLna~rSe*IwFY=g|Vc){MMDgBgJ{+t(eKf-II zj*50(cnvSA=aVH~*iMxcCONO?f=A{s;38h!x*a|@b`3_4}jQ@r#zFWAE!|AV`p=8kQ2H8%0aZD?#A!e%?%^aL;2 z#LKqvDmbk00nX9tZtmX7OP}I=37<%sLg<`ih`Y?PTHPy?>Uq&U!V1$PY(ir_l6MYS z5#mNWZ(7R7JHN{vC;1HL5{@=Z-NTDv4SM1S+_i(75Aca04#!lYf1C&|*FD^{c-bai z1;*oj)LX)5bt0fpMKyH8pX3YEIgU>i5F>}+8tMCA%ivQ^2=QVB#lDf%%v5UX1zgPM zOEpsKIIWeuYW`YOZDh4h0@1OVPa_~(j=sUVtH1%XXmmT^&QgN=L=QXG%E9im_##!h zl;9dpMv#zTUL!l*-0J*|h!0d~q8vRi$t>H)&8Ij971*8eFrf?UdFea6vJWF?F*myT?4`UI{cmwMlp#9FKzNf>!}}su9~a(3eK`1w>MPrf ze(L7N(|o!XE~%s5p=kyxsI#GhrY>{{1spWVerXc@k~JMg@Dx?zcrvdN<5qt0(j3b# zJKu85MfsNG+F);nvnjWV&1iwc#4X3~kA*^h3n#l>=cg?({w@p0u;DN^oS2q~MYaYR z?R+4HL`N)cwIo9<9@~}>{6PFI*p0*1G_JUAc@v#o=vlF7k$mgrncHb4qroNZ!DuiZ zZUq{Mw{|R%=OTLMwtME{Hn9YU!?CSm9}UB%7b}4K4sExfT@yIMjqVLa(oI;2Sna#D>kMXGU=%oZP3w=o~rLik4YHrNAGG1loriKmz{OWZaLX zM6wfS*1-|9k)(C2#oA)YmIw@qMcT+sbW&YhY&ls023FS@wd&gHlF{&1?EVN_JL(dh z^Xj_d?esTS%hr`vG@+vk<#SrDGbS9 zx&_N)SPW)cD9#g+W^5;8;b_=W#-bz0_hOhV zxWYbAMC51PCc?20&F0bz zvfpWP>742BGr9D_?01}8deQK?xV8clZwmEy5*ry0xmZ_X)smk~R?PHw8he?EQ;5Yz z6FU)k6JN7D6?sHKFJtwUBhlU2^N#JMCM#zJ9y>+mO{$cZsCmi6NuUjv=MjOL*c~=7 zBE2emF0ft7#MdhQ9W9qWfsORN#>B~w`uxdUek_Zc?G%|eSvA`~B7OKAQ@fPO^w&K* zmD;7h0_M~8*S~zadcBuRh933m@;thFd3zq+lSjdl4wM4+UM9bw6a)uzv#z{;$J+ow z@6V%Or04^A^eaI(@D=p9@|zmxY?Yv&-(Q_dkNyq|RHPla8tnXj-w*mo_K()ChlQST zEV4kT&AE)E=evTV>b$u6xzKZdTpd&V`g^ag;9o`N{5b!U&~tvg(ThLF2;-E_XB~%r z$$xw6Qgr5#HB$R2)d;%G+pnJ=h28+V$Ihto(_xQig!sRC6g|;V=qW*WpZBi+!BO}R zf?k1o59W=#?~lS?MRdpc^AEjoRj=uCTKAmL<7WBaFX;Q^@|++ zYWPh>&;LU5XGPC{_y4J&tIBMk0uL6{uKce*Qv}_{sIv1FfBx(Jt486!7If;b{C3et zIjT4RE79$sd(N+x?N$8wA3^qkK79oKCqN(Z9PZY*m9X%TiI;7|XK?$iPCw4Pj^ec( zo{VGu_DHNH5b?L+Avoa=B)8*PuoFA?h8^|?;_<)^KYlNP$LA1j zRrj|gJ3Dtk#D@9li8qH;tpNP~Ro6GJ^ZLEluB79?bNR4vTDj@k#&u0Aa!bT%;UHl> z==b`R2H(o-nSb@#>y|gJ^&Xul4%XGE*Jc-I_=WyTy}zLxcUiZgqTk zF7e+wyqwM?&*RnylFReOhYPRFT_e&7<->(^ShznZ77p?x^4ucZYC#@no?9$dqiQuF z4n5B;KJTFN{9>wCo@1_$Nzdg_2cYK?^UrPfw&SM`|B>d!WNhFlHVsVnQ%FJ5~i&Nrr^+ukYiUJP#SW zyk5s@I72fkm@mH)bethZyM;v3`w}&rt?2Y2i4wjQ=A>(ZVfC4{U$2WboUIh&8@>RxxY)HJ^sJqn!3EYFw|! zHQb`)$$sL|_A4^G0~zwEmd~!+)%yLUV$}6(dENedl>BnVr`Puy?p6Uq@>o@5>(}yM z0gYJ5K9MSNA<5WNe*dRXXqWdWc@6c89IYcyJ^Q;ndHr5NL)~62uW=2(nJ2HG4>deW z3shUu^=s0%k+Iuf;E^R7;!R3U%5VQaqLk#b{a3Hp6>Om3w59y|{|RMwdHvo)!vi*1 z%I4SqOrE@cKceBjtYK1-_M5~Qdl4COkv3DWQ}w?ql+Ukm4Sx+;Y#+$V>-Q}KOF%@@ zd=eYRHT_K#Q0(dY^?Mop?>3zw=OF3$)Nk+mn{l@BaWjIWJb%6cK;w5N=3-%yrjtM^9>T_>&@q#IEwsPCI3?10Lqu2K8pO2HM0IGdGVVs zFSg=H)|~5a*GhD+4jfgQFTYsTpWn_c>!rZEx?}R>wVu^VUKMA-bvMcEmMlePw45dr zp4UWCbV$k9EB{Rgm0o@7_|fw>73Y~Kee<=GRZl={y!8*xx4QH{=QAq3r(v DXk{lw literal 0 HcmV?d00001 diff --git a/main.c b/main.c index ab9b6ba..5f9c9d5 100644 --- a/main.c +++ b/main.c @@ -41,18 +41,20 @@ void flushStdin(void); bool load(const char* filename, Matrix* A, Vector* b, Vector* x); Vector* solve(Method method, Matrix* A, Vector* b, Vector* x, double e); +Vector* solveJacobi(Matrix* A, Vector* b, Vector* x, double e); +Vector* solveGaussSeidel(Matrix* A, Vector* b, Vector* x, double e); int readMatrixLine(FILE* file, double* matrixLine, int maxCols); int main(int argc, char* argv[]) { char filePath[MAX_FILE_PATH_LENGTH]; - if(argc >= 2) { - strncpy(filePath, argv[1], MAX_FILE_PATH_LENGTH); - } else { + if(argc >= 2) { // If arguments specified + strncpy(filePath, argv[1], MAX_FILE_PATH_LENGTH); // use first argument as filePath + } else { // Otherwise read from stdin puts("Please enter the path of the file you'd like to open"); int result = scanf("%" STR(MAX_FILE_PATH_LENGTH) "[^\n]", filePath); - if(result == EOF || result == 0 || filePath[0] == 0) { + if(result == EOF || result == 0 || filePath[0] == 0) { // If an error occured or no text has been entered -> exit return 0; } if(result != 1) { @@ -72,12 +74,12 @@ int main(int argc, char* argv[]) { if(load(filePath, matrix, b, x)) { // Debug outputs - //puts("Data successfully loaded\nMatrix A:"); - //printMatrix(matrix); - //puts("Vector b:"); - //printVector(b); - //puts("Vector x:"); - //printVector(x); + puts("Data successfully loaded\nMatrix A:"); + printMatrix(matrix); + puts("Vector b:"); + printVector(b); + puts("Vector x:"); + printVector(x); puts("Please enter the algorithm to use:\n\t0: Jacobi (default)\n\t1: Gauss-Seidel"); int algorithm; @@ -87,15 +89,16 @@ int main(int argc, char* argv[]) { if(algorithm == EOF) { goto end; } - if(algorithm == '0' || algorithm == '1') { - algorithm -= '0'; - break; - } if(algorithm == '\n' || algorithm == 0) { puts("Defaulting to Jacobi"); algorithm = 0; break; } + flushStdin(); + if(algorithm == '0' || algorithm == '1') { + algorithm -= '0'; + break; + } fputs("Please enter 0, 1 or leave empty to exit!\n", stderr); } @@ -107,15 +110,52 @@ int main(int argc, char* argv[]) { if(scan == EOF) { goto end; } + flushStdin(); if(scan == 1) { break; } - flushStdin(); fputs("Invalid input - please enter a valid floating point number!\n", stderr); } Vector* result = solve(algorithm, matrix, b, x, e); - free(result); + if(result == NULL) { + fputs("Failed to run the algorithm!\n", stderr); + returnCode = 100; + } else { + int input; + while(true) { + puts("Choose what to output:\n\t0: Only the final result (default)\n\t1: All the iteration steps"); + input = getchar(); + if(input == '\n') { + puts("Defaulting to final result"); + input = 0; + } else { + flushStdin(); + } + if(input == 0 || input == '\n' || input == '0') { + puts("Showing final result:"); + int i = 0; + while(result[++i].n != 0 && i < MAX_ITERATION_STEPS) + free(result[i-1].data); + printVector(&result[i-1]); + free(result[i-1].data); + break; + } + if(input == '1') { + puts("Showing all iterations:"); + for(int i = 0; i < MAX_ITERATION_STEPS; i++) { + printVector(&result[i]); + if(result[i].n == 0) { + break; + } + free(result[i].data); + } + break; + } + fputs("Please enter 0, 1 or leave empty!", stderr); + }; + free(result); + } break; } else { fputs("Failed to load data from file.\nEnter new file path or leave empty to exit.\n", stderr); @@ -253,21 +293,88 @@ void flushStdin(void) { } Vector* solve(Method method, Matrix* A, Vector* b, Vector* x, double e) { - Vector* vectors = malloc(sizeof(Vector) * (MAX_ITERATION_STEPS + 1)); + if(method == JACOBI) { + return solveJacobi(A, b, x, e); + } else { + return solveGaussSeidel(A, b, x, e); + } +} - // MAX_ITERATION_STEPS enthält die maximal zulässige Anzahl an Iterationsschritten (100) - // Die einzelnen Vektoren müssen noch mit initVector initialisiert werden +Vector* solveJacobi(Matrix* A, Vector* b, Vector* x, double e) { + Vector* history = malloc(sizeof(Vector) * (MAX_ITERATION_STEPS + 1)); + initVector(history, x->n); + memcpy(history[0].data, b->data, b->n * sizeof(double)); + double delta; + int i, j, steps = 1; + double value; + double* data; - // HIER kommt der Code hin ;) + do { + delta = 0.; - // on success - // Sei x die Anzahl der durchgeführten Iterationschritte. Dann setzt vectors[x+1].n = 0. Damit weiß das folgende Programm wie viele Schritte getätigt wurden. - return vectors; + initVector(&history[steps], x->n); + data = history[steps].data; - // on failure - free(vectors); - return NULL; + for(i = 0; i < x->n; i++) { + value = b->data[i]; + for(j = 0; j < x->n; j++) { + if(i != j) + value -= history[steps-1].data[i] * A->data[i][j]; + } + data[i] = value / A->data[i][i]; + + delta = fmax(delta, fabs(data[i] - history[steps - 1].data[i])); + } + + steps++; + } while(delta > e && steps < MAX_ITERATION_STEPS); + + if(steps < MAX_ITERATION_STEPS) { + history[steps].n = 0; + } + + return history; +} + +Vector* solveGaussSeidel(Matrix* A, Vector* b, Vector* x, double e) { + Vector* history = malloc(sizeof(Vector) * (MAX_ITERATION_STEPS + 1)); + + initVector(history, x->n); + memcpy(history[0].data, b->data, x->n * sizeof(double)); + + double delta; + int i, k, steps = 1; + double* data; + double value; + + do { + delta = 0.; + + initVector(&history[steps], x->n); + data = history[steps].data; + + for(k = 0; k < x->n; k++) { + value = b->data[k]; + for(i = 0; i < k; i++) { + value -= A->data[k][i] * data[i]; + } + for(i = k + 1; i < x->n; i++) { + value -= A->data[k][i] * history[steps - 1].data[i]; + } + data[k] = value / A->data[k][k]; + + delta = fmax(delta, fabs(data[k] - history[steps - 1].data[k])); + } + + steps++; + } while(delta > e && steps < MAX_ITERATION_STEPS); + + if(steps < MAX_ITERATION_STEPS) { + history[steps].n = 0; + } + + return history; } inline Matrix* createMatrix(void) { @@ -292,7 +399,7 @@ inline void freeMatrix(Matrix* matrix) { void printMatrix(Matrix* matrix) { for(int i = 0; i < matrix->n; i++) { for(int j = 0; j < matrix->n; j++) { - printf("%lf, ", matrix->data[i][j]); + printf("%le, ", matrix->data[i][j]); } puts(""); } @@ -316,7 +423,7 @@ inline void freeVector(Vector* vector) { void printVector(Vector* vector) { for(int i = 0; i < vector->n; i++) { - printf("%lf, ", vector->data[i]); + printf("%le, ", vector->data[i]); } puts(""); }