1#!/usr/local/bin/ruby 2 3# 4# linear.rb 5# 6# Solves linear equation system(A*x = b) by LU decomposition method. 7# where A is a coefficient matrix,x is an answer vector,b is a constant vector. 8# 9# USAGE: 10# ruby linear.rb [input file solved] 11# 12 13require "bigdecimal" 14require "bigdecimal/ludcmp" 15 16# 17# NOTE: 18# Change following BigDecimal::limit() if needed. 19BigDecimal::limit(100) 20# 21 22include LUSolve 23def rd_order(na) 24 printf("Number of equations ?") if(na <= 0) 25 n = ARGF.gets().to_i 26end 27 28na = ARGV.size 29zero = BigDecimal::new("0.0") 30one = BigDecimal::new("1.0") 31 32while (n=rd_order(na))>0 33 a = [] 34 as= [] 35 b = [] 36 if na <= 0 37 # Read data from console. 38 printf("\nEnter coefficient matrix element A[i,j]\n"); 39 for i in 0...n do 40 for j in 0...n do 41 printf("A[%d,%d]? ",i,j); s = ARGF.gets 42 a << BigDecimal::new(s); 43 as << BigDecimal::new(s); 44 end 45 printf("Contatant vector element b[%d] ? ",i); b << BigDecimal::new(ARGF.gets); 46 end 47 else 48 # Read data from specified file. 49 printf("Coefficient matrix and constant vector.\n"); 50 for i in 0...n do 51 s = ARGF.gets 52 printf("%d) %s",i,s) 53 s = s.split 54 for j in 0...n do 55 a << BigDecimal::new(s[j]); 56 as << BigDecimal::new(s[j]); 57 end 58 b << BigDecimal::new(s[n]); 59 end 60 end 61 x = lusolve(a,b,ludecomp(a,n,zero,one),zero) 62 printf("Answer(x[i] & (A*x-b)[i]) follows\n") 63 for i in 0...n do 64 printf("x[%d]=%s ",i,x[i].to_s) 65 s = zero 66 for j in 0...n do 67 s = s + as[i*n+j]*x[j] 68 end 69 printf(" & %s\n",(s-b[i]).to_s) 70 end 71end 72