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));

ここで、2 つの質問があります。

  1. すでに宣言されている定数であるにもかかわらずp、関数に渡さなければならないのはなぜですか?vp
  2. asまたはその単純化された形式vで完全に式を取得するにはどうすればよいですか?t3*[(50*t+2)*sin(50*t+2)]

更新
これは、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)既に宣言されている定数であるにもかかわらず、なぜ渡さなければならないpのですか?vp

MATLAB のインライン関数オブジェクトにはevalラッパーがあるため、そのスコープ内の変数は、式から自動的にキャプチャされた変数または明示的に指定された変数のみです。

vつまり、を認識したい場合は、オブジェクトを作成して明示的に渡すpときに宣言する以外に選択肢はありません。こちらも同様です!inlinevf

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)」(または適切と思われる適切な無名ヘッダー) を先頭に連結して適用します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その定義中に行うことができます。それ以外の

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 に答える