matlab双重符号转换

时间:2016-06-06 02:03:42

标签: matlab double symbolic-math

是否可以放宽使用sym(或任何其他方法)将双精度数转换为matlab中的符号表达式的容差?例如:

sym(1.732050807568899) = 3900231685777031/2251799813685248 

而不是sqrt(3)。

谢谢!

1 个答案:

答案 0 :(得分:2)

简答

我建议在定义符号sqrt

后应用3函数
rt3 = sqrt(sym(3));

虽然sym(sqrt(3))也可以正常工作,但我喜欢在将简单数字应用于它们之前将它们定义为符号。更多

长答案

默认情况下,sym会尝试查找传递给它们的数字文字的有理等价物。然而,由于许多因素(例如,浮点精度限制,对转换的算法限制,Rationals的设置小于Reals的事实),转换通常不是精确的。但是,sym每次迭代都会继续变得更好,并且可以在给定double数据的情况下进行良好的转换:

>> sym(1./[1:2:11])
ans =
[ 1, 1/3, 1/5, 1/7, 1/9, 1/11]

>> sym(sqrt(2:2:12))
ans =
[ 2^(1/2), 2, 6^(1/2), 2*2^(1/2), 10^(1/2), 2*3^(1/2)]

但是对于一般的双精度数和小数组小数值,仍然存在局限性:

>> sym(rand())
ans =
1143795557080799/9007199254740992

>> sym(1./[ 1E4+1 , 1E5+1 ])
ans =
[ 1/10001, 5902899074596311/590295810358705651712]

因此,我建议在对它们执行任何操作之前,将符号转换应用于整数或具有小的十进制组件(简单/明显合理)的变量或值:

>> 1./sym([ 1E4+1 , 1E5+1 ])
ans =
[ 1/10001, 1/100001]

>> sqrt(sym(1:2:9))
ans =
[ 1, 3^(1/2), 5^(1/2), 7^(1/2), 3]