mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	g -L frozen_string_literal ext/**/*.rb|xargs ruby -Ka -e'ARGV.each{|fn|puts
fn;open(fn,"r+"){|f|s=f.read.sub(/\A(#!.*\n)?(#.*coding.*\n)?/,"\\&#
frozen_string_literal: false\n");f.rewind;f.write s}}'
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53143 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
	
			
		
			
				
	
	
		
			73 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
#!/usr/local/bin/ruby
 | 
						|
# frozen_string_literal: false
 | 
						|
 | 
						|
#
 | 
						|
# 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]
 | 
						|
#
 | 
						|
 | 
						|
# :stopdoc:
 | 
						|
require "bigdecimal"
 | 
						|
require "bigdecimal/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
 |