mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 c1ed63a4c4
			
		
	
	
		c1ed63a4c4
		
	
	
	
	
		
			
			* ext/bigdecimal/sample/nlsolve.rb: ditto. * ext/bigdecimal/lib/bigdecimal/nlsolve.rb: removed because this file is sample script and same file exists in ext/bigdecimal/sample. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@7996 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			71 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| #!/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 "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
 |