我一直在尝试使用C ++的几个计算机代数库来使用我正在进行的矢量微积分课程。我在GiNaC和SymbolicC++中遇到了非线性方程式问题,但它确实有效。
这是一个简单的例子,但问题是我无法弄清楚如何评估数字并将其转换为double或float:
#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};
如何评估这些表达式并将它们转换为double
s?
答案 0 :(得分:6)
我意识到这是对近一年的问题的回答。但是没有办法直接将字符串转换为数字。您需要计算您感兴趣的浮点值 - 就像在计算器上执行它一样。 https://code.google.com/p/exprtk/是一个非常易于使用的库的链接,可以完全满足您的需求。您必须使用字符串流
将Symbolic对象转换为字符串类答案 1 :(得分:0)
尝试:
cout << "p" << i << " = {" << double(x_sol) << ", " << double(y_sol) << "};" << endl;