summaryrefslogtreecommitdiff log msg author committer range
path: root/ext/bigdecimal
diff options
 context: 12345678910152025303540 space: includeignore mode: unifiedssdiffstat only
Diffstat (limited to 'ext/bigdecimal')
-rw-r--r--ext/bigdecimal/sample/linear.rb67
1 files changed, 45 insertions, 22 deletions
 diff --git a/ext/bigdecimal/sample/linear.rb b/ext/bigdecimal/sample/linear.rbindex c4a428e642..7c8ca263eb 100644--- a/ext/bigdecimal/sample/linear.rb+++ b/ext/bigdecimal/sample/linear.rb@@ -6,43 +6,66 @@ # Solves linear equation system(A*x = b) by LU decomposition method. # where A is a coefficient matrix,x is an answer vector,b is a constant vector. #+# USAGE:+# ruby linear.rb [input file solved]+#+ require "bigdecimal" require "ludcmp" -include LUSolve+#+# NOTE:+# Change following BigDecimal::limit() if needed.+BigDecimal::limit(100)+# -def rd_order- printf("Number of equations ?")- n = gets().chomp.to_i+include LUSolve+def rd_order(na)+ printf("Number of equations ?") if(na <= 0)+ n = ARGF.gets().to_i end -BigDecimal::limit(100)-+na = ARGV.size zero = BigDecimal::new("0.0") one = BigDecimal::new("1.0") -while (n=rd_order())>0+while (n=rd_order(na))>0 a = [] as= [] b = []- printf("\nEnter coefficient matrix element A[i,j]\n");- for i in 0...n do- for j in 0...n do- printf("A[%d,%d]? ",i,j); s = gets- a <<=BigDecimal::new(s);- as<<=BigDecimal::new(s);- end- printf("Contatant vector element b[%d] ? ",i);b<<=BigDecimal::new(gets);+ if na <= 0+ # Read data from console.+ printf("\nEnter coefficient matrix element A[i,j]\n");+ for i in 0...n do+ for j in 0...n do+ printf("A[%d,%d]? ",i,j); s = ARGF.gets+ a << BigDecimal::new(s);+ as << BigDecimal::new(s);+ end+ printf("Contatant vector element b[%d] ? ",i); b << BigDecimal::new(ARGF.gets);+ end+ else+ # Read data from specified file.+ printf("Coefficient matrix and constant vector.\n");+ for i in 0...n do+ s = ARGF.gets+ printf("%d) %s",i,s)+ s = s.split+ for j in 0...n do+ a << BigDecimal::new(s[j]);+ as << BigDecimal::new(s[j]);+ end+ b << BigDecimal::new(s[n]);+ end end- printf "ANS=" x = lusolve(a,b,ludecomp(a,n,zero,one),zero)- p x- printf "A*x-b\n"+ printf("Answer(x[i] & (A*x-b)[i]) follows\n") for i in 0...n do- s = zero- for j in 0...n do+ printf("x[%d]=%s ",i,x[i].to_s)+ s = zero+ for j in 0...n do s = s + as[i*n+j]*x[j]- end- p s-b[i]+ end+ printf(" & %s\n",(s-b[i]).to_s) end end