summaryrefslogtreecommitdiff log msg author committer range
path: root/ext/bigdecimal/sample/linear.rb
blob: 7c8ca263eb671346f8c67b13e522a05db4ec90db (plain)
 ```1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 ``` ``````#!/usr/local/bin/ruby # # linear.rb # # 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" # # NOTE: # Change following BigDecimal::limit() if needed. BigDecimal::limit(100) # include LUSolve def rd_order(na) printf("Number of equations ?") if(na <= 0) n = ARGF.gets().to_i end na = ARGV.size zero = BigDecimal::new("0.0") one = BigDecimal::new("1.0") while (n=rd_order(na))>0 a = [] as= [] b = [] 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 x = lusolve(a,b,ludecomp(a,n,zero,one),zero) printf("Answer(x[i] & (A*x-b)[i]) follows\n") for i 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 printf(" & %s\n",(s-b[i]).to_s) end end ``````