日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Ruby 三元一次线性方程组

發布時間:2025/4/5 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Ruby 三元一次线性方程组 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目里需要求出兩個表達式之間的關系,涉及到3個未知數,就用Ruby寫了一個算法,利用了Ruby的BigDecimal,算法本身應該不算復雜,也可以方便的擴展到N元線性方程。之前用JS也寫了一個,但JS的浮點精度不夠,換成了RUBY,都放在了github上(https://github.com/caiqingfeng/formula-solver),如果有用就直接拿過去了,free to copy and commercial use:-)

formula-solver.rb代碼如下:

require "bigdecimal"

?

#solver for a three variables linear formula (three dimensional matrix)?

# matrix M=

# a11 a12 a13

# a21 a22 a23

# a31 a32 a33

# variables = (x, y, z)

# res = (A, B, C)

# res = M * variables;

class FormulaSolver

def findAnswer(matrixInput, resInput)

#combine matrix with resInput

matrix = Array.new(3) {Array.new(4) {BigDecimal.new("0.0")}}

for ii in 0..2

for jj in 0..2

matrix[ii][jj] =? BigDecimal.new(matrixInput[ii][jj].to_s)/BigDecimal.new("1.0")

end

matrix[ii][3] =? BigDecimal.new(resInput[ii].to_s)/BigDecimal.new("1.0")

end

#step 1: row2 or row3+row1*something to get a21 and a31 0

#matrix[0][0] should not be zero, otherwise to reset it by row+row

#reset matrix to guarantee matrix[0][0]!=0

if matrix[0][0] == 0

line = 1;

if matrix[1][0] == 0?

if matrix[2][0] == 0

puts "this formula cannot be solved!"

return

end

line = 2;

end

for ii in 0..3

matrix[0][ii] = matrix[0][ii]+matrix[line][ii]

end

end

for ii in 1..2

if matrix[ii][0] != 0

factor = matrix[ii][0]/matrix[0][0]

for jj in 0..3

matrix[ii][jj] = matrix[ii][jj] - matrix[0][jj]*factor

end

end

end

?

#step 2: set matrix[2][1] = 0

if matrix[1][1] == 0

if matrix[2][1] == 0

puts "this formula cannot be solved!"

return

end

for ii in 1..3

matrix[1][ii] = matrix[1][ii]+matrix[2][ii]

end

end

for ii in 2..2

factor = matrix[ii][1]/matrix[1][1]

if matrix[ii][1] != 0?

for jj in 1..3

matrix[ii][jj] = matrix[ii][jj] - matrix[1][jj]*factor

end

end

end

?

#step 3: set matrix[0][2], matrix[1][2] = 0

if matrix[2][2] == 0

puts "this formula cannot be solved!"

return

end

for ii in 0..1

factor = matrix[ii][2]/matrix[2][2]

if matrix[ii][2] != 0?

for jj in 2..3

matrix[ii][jj] = matrix[ii][jj] - matrix[2][jj]*factor

end

end

end

?

#step 4: set matrix[0][1] = 0

for ii in 0..0

factor = matrix[ii][1]/matrix[1][1]

if matrix[ii][1] != 0?

for jj in [1, 3]

matrix[ii][jj] = matrix[ii][jj] - matrix[1][jj]*factor

end

end

end

?

#step 5: set [0][0]=1, [1][1]=1, [2][2]=1

for ii in 0..2

matrix[ii][3] = matrix[ii][3]/matrix[ii][ii]

matrix[ii][ii] = 1.0

end

matrix

end

end

?

測試代碼:test.rb

require_relative "formula-solver"

?

matrix = [[1, 113.9231311, 22.5034716], [1, 113.95313110000001, 22.5034716], [1, 113.95313110000001, 22.533471600000002]]

#res = [113.93454840179, 113.96456293154, 113.96454575759]

res = [113.93454840179, 113.96454575759, 113.96454575759]

puts FormulaSolver.new.findAnswer(matrix, res)

?

matrix = [[1, 113.9231311, 22.5034716], [1, 113.95313110000001, 22.5034716], [1, 113.95313110000001, 22.533471600000002]]

#res = [22.506156406299, 22.506279984718, 22.536277316988]

res = [22.506279984718, 22.506279984718, 22.536277316988]

puts FormulaSolver.new.findAnswer(matrix, res)

?

運行ruby test.rb得到輸出:(略)

轉載于:https://www.cnblogs.com/mobileinternet/archive/2012/06/10/2543879.html

總結

以上是生活随笔為你收集整理的Ruby 三元一次线性方程组的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。