functionで関数を作る方法

173 views (last 30 days)
sz
sz on 13 Jul 2020
Commented: sz on 13 Jul 2020
下記のようなやり方で
蔵本モデルの微分方程式を解いたのですが、一番最初のfunctionの所でエラーが出てきてしまいます。
function dydt=kuramotomodel(t,y)
エラー: このコンテキストでは関数定義はサポートされません。コードファイルで関数を作成してください。
コードファイルで関数を作成とはどのようなやり方なのでしょうか?
やり方分かるいましたら解決策を伺いたいです。
よろしくお願いいたします。
function dydt=kuramotomodel(t,y) K=10; N=3; omega=0.5; domega=zeros(1,N); for k=1:length(domega) domega(k)=omega; for m=1:length(domega) domega(k)=domega(k)+K/N*sin(y(m)-y(k)); end end dydt = [domega(1); domega(2); domega(3)];
function dydt=kuramotomodel(t,y)
K=10;
N=2;
omega=0.5;
domega=zeros(1,N);
for k=1:length(domega)
domega(k)=omega;
for m=1:length(domega)
domega(k)=domega(k)+K/N*sin(y(m)-y(k));
end
end
dydt = [domega(1); domega(2)];function dydt=kuramotomodel(t,y)

Accepted Answer

Kojiro Saito
Kojiro Saito on 13 Jul 2020
コマンドウィンドウで上記の関数を定義されようとしていませんでしょうか?
コードファイルというのはスクリプトかライブスクリプトのことで、この中で関数を書く必要があります。
MATLABのホームタブから「新規スクリプト」をクリックしてエディターを開き、
上記の関数の定義をコピペし、kuramotomodel.mの名前で保存します。
するとkuramotomodelの関数が呼び出せるようになります。
または、MATLABのホームタブから「レイアウト」をクリックしてコマンド履歴を表示させ、コマンドウィンドウでじっこうしたコマンドを選択して右クリックでスクリプトの作成をクリックしてスクリプトにコピーさせることもできます。
  5 Comments
sz
sz on 13 Jul 2020
ありがとうございます。
下記のようにコマンドウィンドウに打ったらこのようなエラーが出てきてしまいした。
>> t=0:0.1:1;
y=[2/3*pi; 0; 4/3*pi];
kuramotomodel(t, y);
エラー: odearguments (line 21)
ode45 への 1 番目の引数が関数ハンドルの場合、tspan 引数は少なくとも 2 つの要素をもたなければなりません。
エラー: ode45 (line 115)
odearguments(FcnHandlesUsed, solver_name, ode, tspan, y0, options, varargin);
エラー: kuramotomodel (line 17)
[t,y] = ode45(@kuramotomodel,t,y);
エラー: kuramotomodel (line 19)
[t,y] = ode45(@kuramotomodel,t,y);
このようなエラーがでてから、[t y]=ode45(@kuramotomodel,t,y)とはコマンドウィンドウには書いていないのですがodeargument のような感じで書かれた新しいエディターが開きました。
自分は普段エディターにスクリプトを書いて実行を押しているのですが
そこのファイルとkuramotomodel関数は別ということなのでしょうか?
蔵本モデル関数を呼び出すにはエディター及びコマンドウィンドウにどのように書けば良いのか再度伺っても宜しいでしょうか。
理解が遅く申し訳ありません。
よろしくお願いいたします。

Sign in to comment.

More Answers (1)

sz
sz on 13 Jul 2020
教えていただきありがとうございます
function でのエラーがなくなりました。
しかしdomega(k)=domega(k)+K/N*sin(y(m)-y(k));
のy が認識されないとなってしまうのですが、
蔵本モデルの微分方程式を解く解いているのですが、間違えている部分分かる方いましたら
教えていただきたいです。
何度も申し訳ありませんが、よろしくお願いいたします。
function dydt=kuramotomodel(t,y)
K=10;
N=2;
omega=0.5;
domega=zeros(1,N);
for k=1:length(domega)
domega(k)=omega;
for m=1:length(domega)
domega(k)=domega(k)+K/N*sin(y(m)-y(k));
end
end
dydt = [domega(1); domega(2)];
[t,y] = ode45(@kuramotomodel,[2/3*pi;0;4/3*pi]);
v = VideoWriter('kuramotomodel.avi');
open(v);
figure(1)
for i=1:length(y(:,1))
xlim([-1.5 1.5])
ylim([-1.5 1.5])
hold on
plot(cos(y(i,1)),sin(y(i,1)),'b.',cos(y(i,2)),sin(y(i,2)),'r.',cos(y(i,3)),sin(y(i,3)),'g.')
drawnow limitrate
frame=getframe(gcf);
writeVideo(v,frame);
clf
end
close(v);

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!