2017-05-17 6 views
0

プロットを使って私のプログラムのサブ関数をプロットする方法を理解できません。matlabにサブ関数をプロットする方法はありますか?

main() 
... 
    % this works 
    fplot('4 * (x^-12 - x^-6)', [0.98,2]); 
    % these and other combinations don't work 
    fplot('potential', [0.98,2]); 
    fplot('potential(x)', [0.98,2]); 
    plot(0.98:0.01:2, potential(x)); 
end 

function v = potential(x) 
    v = 4 * (x^-12 - x^-6); 
end 

は、あなたはそれのすべてを書きたくない場合は、サブ関数をプロットし、プロットを使用する必要がありますどのようにいくつかの光を当てるしてくださいでした。私は再びこの問題にぶつかると確信しています。

+0

他の組み合わせがどのようにうまくいかないか、具体的にどのようにエラーメッセージが表示されるのか説明してください。 –

+0

「あなたはそれをすべて書いたくない」とはどういう意味ですか? –

+0

また、「00.1」ではなく「0.01」を意味しましたか? –

答えて

2

fplot(またはそのことについてode45)のような関数に文字列を渡すだろうよりstr2funcfevalなどの機能を利用する可能性が最も高いため、ローカル関数またはネスト関数では機能しない可能性があります。どちらの場合も、ローカルまたはネストされた関数が定義されているコンテキストは、fplotおよびode45から隠されており、その関数はMATLABのパス上にないため検出されません。

この問題を回避する方法は、ほとんどの場合、関数ハンドルを使用することです。関数ハンドルは適切なコンテキストデータをバインドし、すべてが意図したとおりに動作します。ハンドルの作成が提供するメタ情報を出力します。この例を考えてみましょう:

function [] = main() 
    potfun = @potential; 
    fplot(potfun, [0.98,2]); 

    % To see more clearly what information the handle has: 
    functions(potfun) 
end 
function v = potential(x) 
    v = 4 * (x.^-12 - x.^-6); 
end 

(私はまた、ほとんど常に良い考えである、要素ごとの指数演算子に切り替える。)

これをfunctionsから以下の構造体を印刷:

>> main 
ans = 
    function: 'potential' 
     type: 'scopedfunction' 
     file: 'C:\main.m' 
    parentage: {'potential' 'main'} 

分かるように、他の関数から(明らかに「scopefunction」)サブ関数を呼び出す完全必要コンテキストが提供されます。

0

使用arrayfun

x = 0.98:00.1:2; 
y = arrayfun(@(x)4 * (x^-12 - x^-6),x); 
% or y = arrayfun(@(x)potential(x),x) 
plot(x,y); 

またはステップは、次のコードの重要な使用されていない場合:

fplot(@(x)potential(x), [0.98, 2]) 
+0

'arrayfun'はここで過度のビットです、いいえ? –

関連する問題