1) Why do I have to pass p to v even though p is a constant which has already been declared?
好吧,MATLAB的内联函数对象有一个eval包装器,因此其范围内唯一的变量是从表达式自动捕获或显式指定的变量.
换句话说,如果您希望v识别p,则在创建内联对象并将其明确传递给v时,您没有其他选项可以声明它. f也是如此!
2) How I can get an expression for v completely in terms of t as 3*[(50*t+2)*sin(50*t+2)] or in its simplified form?
使用匿名函数,如Shai建议的那样.它们更强大,更优雅,更快.例如:
v = @(t)(3*(50*t+2)*sin(50*t+2))
请注意,如果您使用已由变量使用的名称作为参数,则匿名函数将首先将其视为参数.它确实看到了范围内的其他变量,因此也可以执行类似g = @(x)(x p)的操作.
编辑#1:
这是另一个例子,这次是函数的一个函数:
x = 1:5;
f = @(x)(x .^ 3); %// Here x is a local variable, not as defined above
g = @(x)(x + 2); %// Here x is also a local variable
result = f(g(x));
或者另外定义另一个实现它的函数:
h = @(x)f(g(x)); %// Same result as h = @(x)((x + 2) .^ 3)
result = h(x);
输出应该是相同的.
编辑#2:
如果要从表达式字符串中创建匿名函数,请将“@(x)”(或正确的匿名标题,如您所见)连接到开头并应用eval,例如:
expr = '(x + 2) .^ 3';
f = eval(['@(x)', expr]) %// Same result as f = @(x)((x + 2) .^ 3)
请注意,您也可以将char(f)转换回字符串,但您必须手动删除’@(…)’部分.
编辑#3:
如果您正在寻找其他解决方案,可以浏览Symbolic Toolbox.例如,尝试:
syms x
f(x) = x + 2
g(x) = x ^ 3
或者也可以使用sym,如下:
f(x) = sym('x + 2');
g(x) = sym('x ^ 3');
使用subs替换值并评估符号表达式.