2017-06-23 10 views
1

私は記号の微分方程式f(t、y)を入力とし、初期条件に基づいてスロープ場と解曲線を出力するmファイルを開発するためにMATLAB R2016b - 学生版を使用しています。コードはMATLABはinputdlg関数を使用してシンボリック関数の入力をどのように処理できますか?

prompt={'dy/dt =','tspan','y0 ='}; 
title='Slope Field Calculator'; 
answer=inputdlg(prompt,title); 
tspan = str2num(answer{2}); %#ok<*ST2NM> 
y0 = str2double(answer{3}); 
syms t y 
f = symfun(sym(answer{1}),[t,y]); 
[t,y] = ode45(f, tspan, y0); 
hold on 
dirfield(f,-5:.3:5,-5,.3:5) 
plot(t,y,'b','LineWidth',2) 
dirfield(f,-5:.3:5,-5:.3:5)

関数は、@関数、またはインライン関数、または引用符でM-ファイルの名前として入力fを有しています。 dirfield関数は、dtの間隔でt1からt2までのt値を使用し、y1からy2までのy値を使用してdyの間隔でy '= f(t、y)形式の一次ODEの方向フィールドをプロットします。

MATLABヘルプによれば、ode45関数は微分方程式を解きます。 [TOUT,YOUT] = ode45(ODEFUN,TSPAN,Y0)TSPAN = [T0 TFINAL]は、時刻T0からTFINALまでの微分方程式y '= f(t、y)を初期条件Y0で積分する。入力ODEFUNは関数ハンドルです。スカラーTとベクトルYについては、ODEFUN(T,Y)はf(t、y)に対応する列ベクトルを返す必要があります。

コードを実行すると、ダイアログボックスがうまく動作し、入力を受け入れます。しかし、「OK」をクリックすると、コードはこのエラーをスローします。

Warning: Support of character vectors that are not valid variable names or 
define a number will be removed in a 
future release. To create symbolic expressions, first create symbolic 
variables and then use operations on them. 
> In sym>convertExpression (line 1559) 
    In sym>convertChar (line 1464) 
    In sym>tomupad (line 1216) 
    In sym (line 179) 
    In SlopeFieldsSolutionCurves (line 9) 
Undefined function 'exist' for input arguments of type 'symfun'. 

Error in odearguments (line 59) 
    if (exist(ode)==2) 

Error in ode45 (line 115) 
    odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, 
varargin); 

Error in SlopeFieldsSolutionCurves (line 10) 
[t,y] = ode45(f, tspan, y0); 

どこが間違っていますか?

答えて

1

ode45は、シンボリック関数ではなく関数ハンドルをとります。代わりにmatlabFunctionを使用してください:

[t,y] = ode45(matlabFunction(f), tspan, y0); 

は、最初の警告を取り除くために、あなたは少し違っfを定義する必要があります。

f = evalin(symengine, answer{1}); 
f = symfun(f, [t,y]); 
+0

はあなたに@Sheljohnをありがとう!このヒントは私をはるかに遠くにさせ、ode45機能のために完全に機能します。 dirfield関数に起因する新しいエラーがありましたが、dirfield関数の 'f'に' matlabFunction'を適用したところ、完全に機能しました! – Andy

関連する問題