解析数学函数 PL/SQL

Posted

技术标签:

【中文标题】解析数学函数 PL/SQL【英文标题】:Resolve Math Functions PL/SQL 【发布时间】:2013-02-06 11:05:26 【问题描述】:

我需要在 pl/sql 中求解一个数学方程/函数。 oracle pl/sql 中有哪些数学运算/函数可以帮助我解决这样的数学函数:

(3.5/(1+x))+(3.5/(1+x)^2)+(3.5/(1+x)^3)+(3.5/(1+x)^4)+(100/(1+x)^4)=101.55

我想要一个函数来解析这个语句并找出x的值。

Something like this is what I am looking for

有什么帮助吗?谢谢。

【问题讨论】:

我推测,既然您使用的是 SQL,那么数据库将提供 x 的值,对吗? 不,其实我的意思是找出x xD的值是多少 如果它不是内置函数,你要么使用暴力破解,要么编写一些自定义函数。根据您想要做什么,我会考虑使用 Mathematica (wolfram.com/mathematica) 当你的变量 x 被提升到 4 次方时,x 会有 4 个不同的值,对吧? 你试过泰勒的系列吗? 【参考方案1】:

唉,Oracle 数据库不是一个数学工具。它有很多arithmetical and statistical functions,但它没有能够解释方程的内置功能。对不起。


纯属巧合,Marc (AKA Odie_63) 最近发布了一个他用 PL/SQL 编写的逆波兰表示法计算器。它并不完全符合您的要求,但我提供了一个链接,以供将来可能偶然发现此线程的任何寻求者的利益。 Find out more.

【讨论】:

【参考方案2】:

正如 APC 所说,没有内置功能可以做到这一点。但是您可以使用 PL/SQL 中的WolframAlpha API:

declare
    v_equation varchar2(32767) := 
        '(3.5/(1+x))+(3.5/(1+x)^2)+(3.5/(1+x)^3)+(3.5/(1+x)^4)+(100/(1+x)^4)=101.55';
    v_escaped_url varchar2(32767);
    v_uri httpuritype;
    v_xml xmltype;
    v_count number := 1;
begin
    --Escape the URL.
    --I used chr(38) for ampersand, in case your IDE think it's a substitution variable
    v_escaped_url :=
        'http://api.wolframalpha.com/v2/query?appid=EQGHLV-UYUEYY9ARU'||chr(38)||'input='
        ||utl_url.escape(v_equation, escape_reserved_chars => true)
        ||chr(38)||'format=plaintext';

    --Create an HTTPURIType, and get the XML
    v_uri := httpuritype.createUri(v_escaped_url);
    v_xml := v_uri.getXML;

    --Complex solutions
    while v_xml.existsNode('/queryresult/pod[@title="Complex solutions"]/subpod['||v_count||']') = 1 loop
        dbms_output.put_line(v_xml.extract('/queryresult/pod[@title="Complex solutions"]/subpod['||v_count||']/plaintext/text()').getStringVal());
        v_count := v_count + 1;
    end loop;

    --Real solutions
    v_count := 1;
    while v_xml.existsNode('/queryresult/pod[@title="Real solutions"]/subpod['||v_count||']') = 1 loop
        dbms_output.put_line(v_xml.extract('/queryresult/pod[@title="Real solutions"]/subpod['||v_count||']/plaintext/text()').getStringVal());
        v_count := v_count + 1;
    end loop;
end;
/

结果:

x = -1.00006-0.996229 i
x = -1.00006+0.996229 i
x = -1.99623
x = 0.0308219

这种方法有很多潜在的缺点。它会很慢,而且 API 不是免费的。我的示例有效,因为我使用了免费的开发者 appid,但它只适用于少量调用。

【讨论】:

对不起,但我正在寻找一种“独立”的方法 +1 这是一个派对把戏,而且很巧妙。但是许多生产系统不允许数据库像这样连接到另一个站点。此外,您的应用程序变得依赖于第三方的可用性。当然,现在很多企业系统都是由 Web 服务构建的,但很少从数据库中调用它们。

以上是关于解析数学函数 PL/SQL的主要内容,如果未能解决你的问题,请参考以下文章

T-Sql小结

[高等数学]解析一道关于函数极限的概念考察题(001)

用于具有一个变量的数学表达式的 C 解析器并将其保存到函数中

2017 年研究生入学考试数学一填空题第 1 题解析

组合数学及其应用——递推关系和生成函数

cs 保研经验贴 | 数学试题 · 自动化所特供版