summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.1.2/sample/linear.rb
diff options
context:
space:
mode:
authorBen Sanders <ben@sanders.life>2026-08-02 09:49:25 -0400
committerBen Sanders <ben@sanders.life>2026-08-02 09:49:25 -0400
commitb41479c91e6685511c1f8ba8586106b322073b62 (patch)
treec9f1345999d754ae0a533849966427e792d9e68d /vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.1.2/sample/linear.rb
parentcfaceeb9a6d1295f5754be211858155cd309acc2 (diff)
added statscounter code
Diffstat (limited to 'vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.1.2/sample/linear.rb')
-rw-r--r--vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.1.2/sample/linear.rb110
1 files changed, 110 insertions, 0 deletions
diff --git a/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.1.2/sample/linear.rb b/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.1.2/sample/linear.rb
new file mode 100644
index 0000000..0cfac03
--- /dev/null
+++ b/vendor/bundle/ruby/3.4.0/gems/bigdecimal-4.1.2/sample/linear.rb
@@ -0,0 +1,110 @@
+#
+# 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"
+
+# Requires gem matrix
+require "matrix"
+
+class PrecisionSpecifiedValue
+ # NOTE:
+ # Change following PREC if needed.
+
+ attr_reader :value
+ def initialize(value, prec)
+ @value = BigDecimal(value)
+ @prec = prec
+ end
+
+ def unwrap(value)
+ PrecisionSpecifiedValue === value ? value.value : value
+ end
+
+ def coerce(other)
+ [self.class.new(unwrap(other), @prec), self]
+ end
+
+ def abs
+ self.class.new(@value.abs, @prec)
+ end
+
+ def >(other)
+ @value > unwrap(other)
+ end
+
+ def <(other)
+ @value < unwrap(other)
+ end
+
+ def -(other)
+ self.class.new(@value.sub(unwrap(other), @prec), @prec)
+ end
+
+ def +(other)
+ self.class.new(@value.add(unwrap(other), @prec), @prec)
+ end
+
+ def *(other)
+ self.class.new(@value.mult(unwrap(other), @prec), @prec)
+ end
+
+ def quo(other)
+ self.class.new(@value.div(unwrap(other), @prec), @prec)
+ end
+end
+
+return if __FILE__ != $0
+
+def rd_order(na)
+ printf("Number of equations ?") if(na <= 0)
+ ARGF.gets().to_i
+end
+
+na = ARGV.size
+
+while (n=rd_order(na))>0
+ a = []
+ b = []
+ if na <= 0
+ # Read data from console.
+ printf("\nEnter coefficient matrix element A[i,j]\n")
+ for i in 0...n do
+ a << n.times.map do |j|
+ printf("A[%d,%d]? ",i,j); s = ARGF.gets
+ BigDecimal(s)
+ end
+ printf("Contatant vector element b[%d] ? ",i)
+ b << BigDecimal(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
+ a << n.times.map {|j| BigDecimal(s[j]) }
+ b << BigDecimal(s[n])
+ end
+ end
+
+ prec = 100
+ matrix = Matrix[*a.map {|row| row.map {|v| PrecisionSpecifiedValue.new(v, prec) } }]
+ vector = b.map {|v| PrecisionSpecifiedValue.new(v, prec) }
+ x = matrix.lup.solve(vector).map(&:value)
+
+ 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)
+ diff = a[i].zip(x).sum {|aij, xj| aij*xj }.sub(b[i], 10)
+ printf(" & %s\n", diff.to_s)
+ end
+end