选择数值或符号算术
符号数学工具箱™通过使用数值或符号算术来操作数字。在数值算术中,使用双精度或可变精度以浮点格式表示数字。在符号算术中,你用精确的形式表示数字。本主题比较了双精度、可变精度和符号算术。
双精度运算
MATLAB中的数值计算®默认使用双精度算法。例如,求表达式的值10001/1001,π, .结果被转换为双精度值。
X = 10001/1001 y = PI z =√(2)
X = 9.9910 y = 3.1416 z = 1.4142
有关双精度算法的更多信息,请参见浮点数.当您没有“符号数学工具箱”或正在使用不接受符号输入的函数时,建议使用此算术。否则,建议使用精确符号算法和变精度算法。方法将符号值转换为双精度值双
函数。
可变精度运算
变精度算法的使用vpa
是符号数学工具箱中数值计算的推荐方法。在使用变精度算法执行计算时,可以指定有效位数。
例如,使用vpa
求分数的值10001/1001.默认情况下,vpa
将输入计算为32位有效数字。近似分数10001/1001至少32位有效数字。
vpa (10001/1001)
Ans = 9.991008991008991008991008991008991008991009
将分数近似为至少8位有效数字。方法更改有效位数数字
函数。
数字(8);vpa (10001/1001)
Ans = 9.991009
象征性的算术
符号数学工具箱提供信谊
而且信谊
精确执行的函数符号计算.在符号算术中,您可以执行包含精确形式的数字和变量的计算,例如x / 2
,2 ^ (1/2)
,或π
.下面的三个例子展示了在符号算术中执行的几种计算。
表达无理数
使用信谊
创造符号数字。表达无理数π而且
以象征的形式。
X = sym(pi) y =√(sym(2))
X = y = 2^(1/2)
使用大整数执行计算
当您声明一个数字时,MATLAB会自动将该数字转换为双倍精度。例如,声明整数80435758145817515
的输入参数信谊
.这个数字失去了它的准确性,因为它比最大的连续整数大flintmax
精确到双倍,也就是2 ^ 53
.
zincorrect = sym(80435758145817515)
Z = 8.0436e+16 zincorrect = 80435758145817520
信谊
.
Zaccurate = sym('80435758145817515')
Zaccurate = 80435758145817515
然后,您可以使用符号算术精确地执行对大整数的计算。例如,求三个大整数的立方的和。
Z1 = sym('80435758145817515') Z2 = sym('12602123297335631') Z3 = sym('-80538738812075974') Zsum = Z1^3 + Z2^3 + Z3^3
Z1 = 80435758145817515 Z2 = 12602123297335631 Z3 = -80538738812075974 Zsum = 42
解数学方程
用符号算术,你可以解出一个数学方程。例如,解二次方程斧头2+bx+c= 0.使用信谊
要声明变量x这些系数一个,b,c在二次方程中。
Syms a bc x eqn = a*x^2 + b*x + c == 0;
使用以下方法找到解万博 尤文图斯决方案解决
并将它们作为象征性的表达返回。
Sols = solve(eqn,x)
溶胶= - (b + b ^ 2 - 4 * * c) ^ (1/2)) / (2 *) - (b - b (^ 2 - 4 * * c) ^ (1/2)) / (2 *)
使用潜艇
用符号值代替系数。集一个= 1,b= 2,而且c= 3.将二次方程的解作为符号万博 尤文图斯数返回。
solsSym = subs(sols,[a b c],[1 2 3])
solsSym = - (8^(1/2)*1i)/2 - 1 (8^(1/2)*1i)/2 - 1
然后可以将符号解转换为双精度或可变精度的浮点格式。万博 尤文图斯
数字(32);solsDouble = double(solsSym) solsVpa = vpa(solsSym)
solsDouble = -1.0000 - 1.4142i -1.0000 + 1.4142i solsVpa = -1.0 - 1.4142135623730950488016887242097i -1.0 + 1.4142135623730950488016887242097i
数值和符号算术的比较
下表比较了双精度、可变精度和符号算术。
双精度 | 可变精度 | 象征性的 | |
---|---|---|---|
示例1:评估sin(π) |
A = sin() A = 3.1416 ans = 1.2246e-16 |
B = vpa() sin(B) B = 3.1415926535897932384626433832795 ans = -3.2101083013100396069547145883568e-40 |
C = sym() sin(C) C = ans = 0 |
示例2:评估1 - 3*(4/3 - 1) |
A = 4/3 1 - 3*(A - 1) A = 1.3333 ans = 2.2204e-16 |
数字(16);B = vpa(4/3) 1 - 3*(B - 1) B = 1.333333333333333 ans = 3.308722450212111e-24 |
C = sym(4)/3 1 - 3*(C - 1) C = 4/3 ans = 0 |
函数的使用 | 双 |
vpa 数字 |
信谊 |
数据类型 | 双 |
信谊 |
信谊 |
舍入误差 | 是的,答案有16位精度。 | 是的,数字的数量取决于使用的精度。 | 不,结果是准确的。 |
速度 | 快 | 更快,取决于使用的精度 | 最慢的 |
内存使用情况 | 至少 | 变量,取决于所使用的精度 | 最大的 |