From 87704d6a3c19eb991aa161b56a1a6b7ed1959504 Mon Sep 17 00:00:00 2001 From: shigek Date: Tue, 21 Oct 2003 03:18:44 +0000 Subject: can read data from file. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4818 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/bigdecimal/sample/linear.rb | 67 +++++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 22 deletions(-) (limited to 'ext/bigdecimal') diff --git a/ext/bigdecimal/sample/linear.rb b/ext/bigdecimal/sample/linear.rb index 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 -- cgit v1.2.3