mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	can read data from file.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@4818 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									212d962a3b
								
							
						
					
					
						commit
						87704d6a3c
					
				
					 1 changed files with 45 additions and 22 deletions
				
			
		| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue