是否可以放宽使用sym(或任何其他方法)将双精度数转换为matlab中的符号表达式的容差?例如:
sym(1.732050807568899) = 3900231685777031/2251799813685248
而不是sqrt(3)。
谢谢!
答案 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]