格式化数学函数

时间:2014-01-23 20:22:47

标签: java

我有一大堆数学函数从这个格式的程序中输出:

(704253724578.0182000000000000 .* (mydivide (mydivide (mydivide (mysqrt (- X13 X11)) (mydivide X18 X15)) (* (square (mydivide (* X1 X20) X19)) X2)) (mydivide (* (* X1 X20) (mydivide X25 X15)) X9))) + 77.2424201451314200

我需要编写一个脚本来将它们转换成可读的格式,如下所示:

(704253724578.0182000000000000 * ( ((sqrt(X13-X11) / (X18/X15)) /((((X1*X20)/X19)^2) * X2))/ (((X1 * X20) * (X25 / X15)) / X9)) ) + 77.2424201451314200

关于在java中执行此操作的最佳方法的任何想法?或者除了java之外还有其他更好的工具吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

安装Ruby和一个名为“sexpistol”的漂亮宝石,它允许你处理s表达式。

我为你破解了一个解决方案:

require 'sexpistol'
require 'pp'

exp="(704253724578.0182000000000000 .* (mydivide (mydivide (mydivide (mysqrt (- X13 X11)) (mydivide X18 X15)) (* (square (mydivide (* X1 X20) X19)) X2)) (mydivide (* (* X1 X20) (mydivide X25 X15)) X9))) + 77.2424201451314200"

parser = Sexpistol.new
tree= parser.parse_string(exp)

SYM={
    :".*" => :*,
    :*   => :*,
    :"+" => :"+",
    :- => :-,
    :mydivide => :/,
    :square => "^2",
    :mysqrt => "mysqrt"
    }

def isPrefix sexp
    return true if SYM[sexp.first]
    return false    
end

def p2i sexp
    if sexp.is_a? Array
        if isPrefix(sexp)
            op,lhs,rhs =sexp
            case op
            when :square
                return [p2i(lhs),SYM[op]]
            when :mysqrt
                return [:mysqrt,p2i(lhs)]
            else
                return [p2i(lhs),SYM[op],p2i(rhs)]
            end
        else
            lhs,op,rhs=sexp
            return [p2i(lhs),SYM[op],p2i(rhs)]
        end
    else
        return sexp
    end
end

pp parser.to_sexp(p2i(tree)).first
# prints : (704253724578.0182 * ((((mysqrt (X13 - X11)) / (X18 / X15)) / ((((X1 * X20) / X19) ^2) * X2)) / (((X1 * X20) * (X25 / X15)) / X9))) + 77.24242014513142

如果你写论文,你可以承认我!