Soru sorMatlab for döngüsü oluşturma
serdargunay tarafından 3 yıl önce soruldu

Merhaba, Matlab function bloğuna yazdığım kodda for döngüsünü oluşturamadım. İşlem döngüyü direk atlıyor. Bunu nasıl çözebilirim? Yardımlarınızı bekliyorum
Not: u bilgisi adc ile alınan baatrya gerilim bilgisi x=1 olması durumu şarj y=1 olması durumu deşarj
u, 0.9 değerine eşitküçükse,
u 1.2 değerine gelene kadar x=1 olsun
u 1.2 değerine eşit büyükse veya 1.2 ile 0.9 arasındaysa
u 0.9’a eşit olana kadar y=1 olsun

function [x,y] = fcn(u)
%#codegen
while (1)
if (u=1.2) || (u>0.9) && (u<1.2) %Deşarj
for u=0.9
x=0;
y=1;
end
else
x=0;
y=0;
end
end
end
6 Cevap
En iyi cevap
Caglar Yönetici tarafından 3 yıl önce cevaplandı

Merhaba,
O zaman siz fcn(u) seklinde o fonksiyonu her cağırdığınızda x ve y değerlerini elde etmek istiyorsunuz. Bu durumda while dongusu anlamsız, songuz donguye sokar. Simulink bağlamında böyle bir yazım şekli vardır ve ben bilmiyorumdur belki. 
Bir de siz 0.9'un altında kalınca 1.2'ye kadar dolsun istiyorsunuz. Ama Fonksiyon sadece u değerini input olarak alıyor. Bu durumda şarj etmeye başlayınca kaydetmemiz lazım ki fonksiyon doğru işlevi verebilsin. Yani mesela fcn(1.1) şeklinde kodu çalıştırdınız. Şarj ederken mi 1.1'e geldi yoksa 1.2'den azalırken mi geldi bunu şu an kod bir yerde kaydetmiyor. Bunu da yaptırmak gerekir değil mi? 
Ben aşağıya normal (simulinksiz) kod olarak yazdım anladığım şeyi:

dolu_gerilim = 1.2;
bos_gerilim = 0.9;
u = 1.5; %baslangic gerilimi
x = 0; y = 1; %baslangic aninda
while(1)
    u = u - 0.15; %u degisimi algoritmasi. her iterasyonda 0.15 azaliyor.
    if u < 0.9 %u 0.9'dan kucukse şarj konumuna al
        x = 1; y = 0;
    elseif u < 1.2 %u 0.9'dan buyuk ama 1.2'den kucukse mevcut konumda kal
        x = x; y = y; %bu satira aslinda gerek yok ancak mantiginin anlasilmasi icin ekledim
    elseif u >= 1.2 %u 1.2'den buyukse dejarj konumuna al
        x = 0; y = 1;
    end
end

Faydalı oldu mu bilmiyorum. Ek bir bilgi varsa yazabilirsiniz. Ancak yazdıklarınızdan konuya pek hakim olmadığınızı seziyorum. Önce döngüleri ve mantık operatörlerinin temel çalışma prensiplerini (&, | ) çalışmak faydalı olabilir. Mesela " (u==1.2) || (u>0.9) && (u==0.9)" yazımının bir anlamı yok. Oradaki && yani "ve" işareti ekleme anlamına gelmiyor. Soldaki ve sağdaki koşulun ikisinin birden gerçekleşmesi anlamına geliyor. Hiçbir zaman da u hem 0.9 hem de 1.2 olmaz.

serdargunay tarafından 3 yıl önce cevaplandı

kodun yeni halinde "
Output argument 'x' is not assigned on some execution paths." bu hatayı alıyorum. sebebi ne olabilir yardım edermisiniz?

kod:
function [x,y] = fcn(u)
%#codegen

if (u<=0.9) %Şarj
while (u1.2) || (u>0.9) && (u=0.9)
x=0;
y=1;
end
else
x=0;
y=0;
end
end

Caglar Yönetici tarafından 3 yıl önce cevaplandı

if'le başlayan kısımda ne yapmak istediğiniz belli mi? Sözle anlatabilir misiniz? U değeri 0.9'dan küçükse diyorsunuz, sonra 0.9'dan büyük mü diye kontrol ediyorsunuz. Burada bir mantık hatası var. 

serdargunay tarafından 3 yıl önce cevaplandı

Caglar bey, bu kod batarya gerilimine göre çalışacak. bataryanın sürekli şarjda kalmaması için. batarya gerilimi 0.9 değerindeyse veya daha az değerdeyse şarj konumuna geçecek ve batarya gerilimi 1.2 olana kadar bu konumda kalacak. 1.2 olunca bu şarttan çıkacak ve deşarj olmaya geçecek. deşarj konumunda da u bilgisi 0.9 olana kadar kalacak. Sonra tekrar birinci koşula giderek şarj olacak

serdargunay tarafından 3 yıl önce cevaplandı

şarj konumu x=1 y=0
deşarj konumu x=0 y=1 
yani 0.9 altındaysa 1.2 ye kadar şarj et, 1.2 olunca 0.9a kadar deşarj et. Sürekli şarjda kalmayacak

Caglar Yönetici tarafından 3 yıl önce cevaplandı

Kodumda baştaki ilk iki satırın (dolu_gerilim = 1.2; bos_gerilim = 0.9;) anlamı yok, silinebilir. Sayısal değer yerine değişken kullanayım demiştim ama sonra sayıları yazmışım yine.