3

这是我的代码的一部分。

clear all;
clc;
p = 50;
t = [-6 : 0.01 : 6];
f = inline('(t+2).*sin(t)', 't')
v = inline('3*f(p*t+2)','t','f','p')
plot(t,f(t));
v(t,f,p);
figure;
plot(t,v(t,f,p));

这里我有两个问题。

  1. 为什么我必须传递p给函数v,即使p是一个已经声明的常量?
  2. 我如何才能v完全按照tas3*[(50*t+2)*sin(50*t+2)]或其简化形式获得表达式?

更新
这是第二个问题的更新

f(x) = 1 + x - x^2
g(x) = sin(x)

如果我给 f(g(x)),我想用文字得到输出,像这样

f(g(x)) = (cos(X))^2 + sin(x)

不是数值。有没有功能可以做到这一点?

4

3 回答 3

4

1)为什么我必须传递pv即使p是一个已经被声明的常量?

好吧,MATLAB 的内联函数对象有一个eval包装器,因此其范围内的唯一变量是那些从表达式中自动捕获或显式指定的变量。

换句话说,如果您想v识别p,您别无选择,只能在创建inline对象时声明它并将其v显式传递给它。也一样f

2) 我怎样才能完全用 t 作为 3*[(50*t+2)*sin(50*t+2)] 或其简化形式得到 v 的表达式?

使用匿名函数,就像 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)' (或您认为合适的正确匿名标头)连接到开头并 apply 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替换值并计算符号表达式。

于 2013-01-30T13:10:45.633 回答
3

如何使用匿名函数

p = 50;
t = -6:0.01:6;
f = @(x) (x+2).*sin(x);
v = @(x) 3*f(p*x+2);
figure;
subplot(1,2,1); plot( t, f(t) ); title('f(t)');
subplot(1,2,2); plot( t, v(t) ); title('v(t)');

这是你想要的吗?

于 2013-01-30T12:50:13.000 回答
0

inline可以在定义期间将常量添加到 an中。代替

p = 50;
v = inline('3*f(p*t+2)','t','f','p')

你可以写

p = 50;
v = inline(  sprintf('3*f(%f*t+2)', p), 't','f')
于 2013-01-31T09:52:58.687 回答