5

我一直在尝试一些用于 C++ 的计算机代数库,以便与我正在学习的向量微积分课程一起使用。我在 GiNaC 和SymbolicC++中遇到非线性方程时遇到了问题,它确实有效。

这是一个简单的例子,但问题是我不知道如何评估一个数字,也许将它转换为一个双精度或浮点数:

#include <iostream>
#include "symbolicc++.h"

using namespace std;
int main(void)
{
    Symbolic x("x"), y("y");

    Equation e1 = (x^2) + (y^2) == 13;
    Equation e2 = (x^2) - y == 7;

    Equations eqs = {e1, e2};
    list<Symbolic> symbs = {x, y};
    list<Equations> sols = solve(eqs, symbs);

    Symbolic x_sol, y_sol;
    int i = 1;
    for( auto iter1 = sols.begin(); iter1 != sols.end(); iter1++)
    {
        x_sol = x.subst((*(*iter1).begin()));
        y_sol = y.subst((*(--(*iter1).end())));
        cout << "p" << i << " = {" << x_sol << ", " << y_sol << "};" << endl;
        i++;
    }
    return 0;
}

使用该输出,我可以将其复制并传递到ginsh它,它的评估结果很好,但它在 SymbolicC++ 中保持扩展形式。

我得到的确切输出如下:

p1 = {1/2*(-2*(25)^(1/2)+26)^(1/2), -1/2*(25)^(1/2)-1/2};
p2 = {1/2*(2*(25)^(1/2)+26)^(1/2), 1/2*(25)^(1/2)-1/2};
p3 = {-1/2*(-2*(25)^(1/2)+26)^(1/2), -1/2*(25)^(1/2)-1/2};
p4 = {-1/2*(2*(25)^(1/2)+26)^(1/2), 1/2*(25)^(1/2)-1/2};

如何评估这样的表达式并将它们转换为doubles?

4

2 回答 2

7

我意识到这是对将近一岁的问题的答案。但是没有办法直接将字符串转换为数字。您需要计算您感兴趣的浮点值 - 就像在计算器上一样。https://code.google.com/p/exprtk/是一个非常易于使用的库的链接,可以准确地完成您正在寻找的内容。您必须使用字符串流将符号对象放入字符串类

于 2015-01-27T22:45:30.590 回答
0

尝试:

cout << "p" << i << " = {" << double(x_sol) << ", " << double(y_sol) << "};" << endl;
于 2014-08-19T04:18:40.227 回答