2017-12-02 10 views
0

私はscilabで非同期電動機のモデルを作成しようとしており、rpm、電流、トルクが経時変化する様子をグラフで表示しています。それはかなり長いように見えますが、すべてを読む必要はありません。シラバスプロットが不適切なode値を示しています

fHz = 50; 
Um = 230; 
p = 3; 
we = 2*%pi*fHz/p; 
wb = 2*%pi*50; 
Rs = 0.435; 
Rr = 0.64; 
Ls = 0.0477; 
Xls = wb*Ls; // [Ohm] 
Lr = 0.0577; 
Xlr = wb*Lr; // [Ohm] 
Lm = 0.012; 
Xm = wb*Lm; // [Ohm] 
Xml = 1/(1/Xls + 1/Xm + 1/Xlr) // [Ohm]; 
D = 0.0002; 
J = 0.28; 
Mt = 0.0; 

function [xdot]=AszinkronGep(t, x, Um, fHz) 

xdot = zeros(12, 1); 

Fsq = x(1); 
Fsd = x(2); 
Frq = x(3); 
Frd = x(4); 
wr = x(5); 
isabc(1) = x(6); 
isabc(2) = x(7); 
isabc(3) = x(8); 
irabc(1) = x(9); 
irabc(2) = x(10); 
irabc(3) = x(11); 

Ua = Um*sin(2*%pi*fHz*t); 
Ub = Um*sin(2*%pi*fHz*t - 2*%pi/3); 
Uc = Um*sin(2*%pi*fHz*t + 2*%pi/3); 

Uab = 2/3*[1, -0.5, -0.5; 0, sqrt(3)/2, -sqrt(3)/2]*[Ua;Ub;Uc]; 

phi = 2*%pi*fHz*t; 
Udq = [cos(phi), sin(phi); -sin(phi), cos(phi)]*Uab; 
Usd = Udq(1); 
Usq = Udq(2); 
Urd = 0; 
Urq = 0; 

isd = (Fsd-Xml*(Fsd/Xls + Frd/Xlr))/Xls; 
isq = (Fsq-Xml*(Fsq/Xls + Frq/Xlr))/Xls; 
ird = (Frd-Xml*(Fsd/Xls + Frd/Xlr))/Xlr; 
irq = (Frq-Xml*(Fsq/Xls + Frq/Xlr))/Xlr; 

isdq = [isd; isq]; 
isalphabeta = [cos(phi), -sin(phi); sin(phi), cos(phi)]*isdq; 
isabc = [1, 0; -0.5, sqrt(3)/2; -0.5, -sqrt(3)/2]*isalphabeta; 

irdq = [ird; irq]; 
iralphabeta = [cos(phi), -sin(phi); sin(phi), cos(phi)]*irdq; 
irabc = [1, 0; -0.5, sqrt(3)/2; -0.5, -sqrt(3)/2]*iralphabeta; 

//TORQUE 
Me = (3/2)*p*(Fsd*isq - Fsq*isd)/wb 

Fmq = Xml*(Fsq/Xls + Frq /Xlr); 
Fmd = Xml*(Fsd/Xls + Frd /Xlr); 

//Differential equations 
xdot(1) = wb*(Usq - we/wb*Fsd + Rs/Xls*(Fmq - Fsq)); 
xdot(2) = wb*(Usd + we/wb*Fsq + Rs/Xls*(Fmd - Fsd)); 
xdot(3) = wb*(Urq - (we - wr)/wb*Frd + Rr/Xlr *(Fmq - Frq)); 
xdot(4) = wb*(Urd + (we - wr)/wb*Frq + Rr/Xlr *(Fmd - Frd)); 
xdot(5) = p*(Me - D*wr - Mt)/J; 
xdot(6) = isabc(1); 
xdot(7) = isabc(2); 
xdot(8) = isabc(3); 
xdot(9) = irabc(1); 
xdot(10) = irabc(2); 
xdot(11) = irabc(3); 
xdot(12) = Me; 

if t <= 5 then 
disp(Me); 
end 

endfunction 


//Simulation parameter 
t = 0:0.001:5; 
t0 = 0; 

//Starting parameters 
y0 = [0;0;0;0;0;0;0;0;0;0;0;0] 
y = ode(y0,t0,t,list(AszinkronGep,Um,fHz)); 

//Graphs 
figure(1) 
plot(t,y(5,:), "linewidth", 3); 
xlabel("time [s]", "fontsize", 3, "color", "blue"); 
ylabel("rpm [rpm]", "fontsize", 3, "color", "blue"); 

figure(4) 
plot(t,y(12,:), "linewidth", 3); 
xlabel("time [s]", "fontsize", 3, "color", "blue"); 
ylabel("torque [Nm]", "fontsize", 3, "color", "blue"); 

「Me」を時間の関数として表示するグラフが必要です。ですから、私は次のように書いています:xdot(12)=私は、それをプロットしますが、どうやってどうしたらいいのでしょうか。チェックするだけで、関数の最後に 'disp(Me)'を追加して、計算が正しいかどうかを確認しました。そして、そうです、それらは正しい値です。私はそれをプロットするとき、なぜ私に異なる値を与えますか?

+0

'Y(12)は' Me' 'での積分であるから、と私自身ではない? – LutzL

+0

ええと、私はそれを正しくする必要がありますか?私がプロット(t、私)を試してみると、 '未定義変数'と表示されます。私はそれが 'Me'が関数の内部で定義されているからだと思います。 – Fifmut

+0

また、解の計算された状態についてODE関数 'xdot = AszinkronGep(t、x、Um、fHz)'を評価し、 'xdot(12)'から 'Me'値を抽出することもできます。 – LutzL

答えて

0

コメントに記載されているように、y(12)Meの整数でtを超えています。 あなたがMeをしたい場合、あなたはそれを区別する必要があります。

//after you run ode() and have y values 
h = t(2) - t(1); 
Me = diff(y(12,:)) ./ h; 

//plotting 
scf(); clf(); 

subplot(2,1,1); 
xtitle("y(12,:)"); 
plot2d(t,y(12,:)); 

subplot(2,1,2); 
xtitle("Me"); 
plot2d(t(1:$-1),Me); 

ここでは、出力されます。

おそらく

1

+0

それはまさにそれのように見える!プロットをどのように達成したかを明確にすることはできますか?私はまだそれをプロットしようとすると、空のグラフが空になります。わずかに関連するノートでは、x(6)-x(11)と同じ問題があります。その場合、関数の形式は正しいですが、振幅だけではありません。同じように差別化する必要がありますか? – Fifmut

+0

@Fifmut私は自分の答えを編集しました。コードをもう一度確認してください。 '' diff() ''が '' y(12、:) 'の長さを1つ減らすので' '$' 'が最後のインデックスを意味する' 't(1:$ - 1)' ' '。また、私はMATLABとの互換性のために存在する '' plot() ''を使用して嫌いです。私は常に '' plot2d() ''を使います。 – luispauloml

+0

私はあなたの方法を使用して、すべての正しい値を得ました。あなたがどれくらいあなたを助けてくれたか分かりません、ありがとう! – Fifmut

関連する問題