用syms或@(x(定义函数有什么区别?
例如:
syms f(t)
f(t) = 0.5*cos(280*pi * t) + 0.5 * sin(260*pi * t) + 0.5 * cos(300*pi * t);
和
f = @ (t) 0.5*cos(280*pi * t) + 0.5 * sin(260*pi * t) + 0.5 * cos(300*pi * t);
谢谢
符号函数
syms f(t)
f(t) = 0.5*cos(280*pi * t) + 0.5 * sin(260*pi * t) + 0.5 * cos(300*pi * t);
定义符号函数。这意味着使用该函数时不会损失精度。结果总是准确的:
>> f(1)
ans =
1
此外,还可以对函数应用符号操作。例如,您可以计算其导数函数以及其他操作:
>> g = diff(f)
g(t) =
130*pi*cos(260*pi*t) - 140*pi*sin(280*pi*t) - 150*pi*sin(300*pi*t)
这是一个新的符号函数,可以正常使用:
>> g(1/260)
ans =
140*pi*sin(pi/13) - 130*pi + 150*pi*sin((2*pi)/13)
再次注意结果是如何准确的。如果要获取其数值(必然是近似值(,可以转换为double
浮点表示形式:
>> double(g(1/260))
ans =
-84.154882885760415
或者,如果您需要更多小数,可以使用vpa
:
>> vpa(g(1/260), 50)
ans =
-84.154882885760413712114778738680201384788201830179
使用符号函数会产生效率成本:代码通常比标准函数慢。此外,它们仅限于数学运算,而标准函数可以做许多其他事情,例如处理文本或文件。
标准、数值函数
f = @ (t) 0.5*cos(280*pi * t) + 0.5 * sin(260*pi * t) + 0.5 * cos(300*pi * t);
定义一个标准的数值函数。更具体地说,它定义一个匿名函数,然后将f
定义为该函数的句柄,结果f
可用作函数名称。
您"只能"使用此函数来传递输入并获取输出作为结果。此外,使用默认的浮点double
数据类型,您可能会遇到一些数值错误。例如,f(1)
给出
>> f(1)
ans =
0.999999999999963
而不是确切的结果1
.
与符号情况相反,Matlab 不知道如何计算其导数,因此在这种情况下,您必须以数字方式(使用有限差分(进行计算,这是一种近似值(因为使用有限差分和因为使用浮点值(:
>> t0 = 1/260;
>> h = 1e-9;
>> (f(t0+h)-f(t0))/h
ans =
-84.154498258826038
与符号函数相比,标准函数更快(并且不需要符号工具箱(,并且如上所述,不限于数学运算。