C de formül yazma yardım !

Başlatan Kaanx, 29 Mayıs 2014, 10:01:06

Kaanx

Merhaba arkadaşlar. C ile şu formülleri yazmam gerekiyor vakti olan yardımcı olabilir mi acaba  ?

ppb= ((VB/ VC - 1 ) *RL/Ro *10-c)^1 /m

Rs/Ro=(VB/ VC - 1) *RL/Ro

Arduino da ppm hesaplmam için gerekli Arduino idede yazıcam. Aynı şekilde stm32f4 içinde yazmam gerekiyor. Keil de

Burak B

#1
Yazmışsın işte :)

    float ppb;
    float RsRo;

    ppb = ((VB/VC - 1) * (RL/Ro) * (10-c)) ^ (1 /m);

    RsRo = (VB/VC - 1) * (RL/Ro);
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

SpeedyX

(10-c)) ^ (1 /m); burada ^ işareti üs anlamına gelmez, dikkat!!

ErsinErce

kök ile üs arasında ohm ile siemens arasındaki bağıntı olduğundan

o yazım şekli ile üs anlamına gelir ama kodlarken m. dereceden kök işlemi daha hızlı olabilir,
iki türlü de denemek lazım

muuzoo

Alıntı yapılan: ErsinErce - 29 Mayıs 2014, 10:55:41
kök ile üs arasında ohm ile siemens arasındaki bağıntı olduğundan

o yazım şekli ile üs anlamına gelir ama kodlarken m. dereceden kök işlemi daha hızlı olabilir,
iki türlü de denemek lazım

Hocam C 'de ^ operatörü XOR işlemini temsil ediyor. O yazımda xor işlemi yapılmış olmuyor mu?
gunluk.muuzoo.gen.tr - Kişisel karalamalarım...

Burak B

#5
Pardon benim hatam. Doğru ^ üst almaz XOR yapar. Aceleyle cevap yazdım. Doğrusu aşağıdaki gibi olacak.
#include <math.h>

    float ppb;
    float RsRo;

    ppb = pow((VB/VC - 1) * (RL/Ro) * (10-c), 1 /m);

    RsRo = (VB/VC - 1) * (RL/Ro);


Burada verdiğim üst alma standart C kütüphanesi kullanıyor. Hızlı olsun derseniz pow() fonksiyonunu kendiniz uygun bir optimizasyonla yazmalısınız.

Hız için x^y = e^(y*ln(x)) olduğundan bunu optimize etmek gerekiyor.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

ErsinErce

Alıntı yapılan: muuzoo - 29 Mayıs 2014, 11:10:34
Hocam C 'de ^ operatörü XOR işlemini temsil ediyor. O yazımda xor işlemi yapılmış olmuyor mu?

doğru xor işlemi, artık ezbere gittiğimizden herhalde 1/m den dolayı direk üs mü kök mü sorusunun üzerine gittim =)

Burak B

Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

picusta

Alıntı yapılan: ByteMaster - 29 Mayıs 2014, 12:02:18
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.
üniter testler de çikmaz mi ? Bu tip formülleri elbet tek tek çalistirip sonuçlarini karsilastirmak gerekir.

Burak B

#9
Alıntı yapılan: picusta - 29 Mayıs 2014, 22:06:22
üniter testler de çikmaz mi ? Bu tip formülleri elbet tek tek çalistirip sonuçlarini karsilastirmak gerekir.

Evet çıkar. :) Oralara girersek TDD nedir diye kökten anlatmak lazım. Ben kısa kısa geçtim. Zira bu konuları benden çook çook daha iyi anlatabilecek üstadlarım var forumda.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

Alıntı yapılan: ByteMaster - 29 Mayıs 2014, 12:02:18
Bu ^ işaretinin gözümüzden kaçması çok önemli bir hata aslında. Bu tip şeylere çok dikkat etmek gerekli. Çünkü eğer hayatı ilgilendiren bir projede kod yazıyor olsaydık derleyici burada hata vermeden kodu derleyecekti. PC-Lint bile bu hatanın üstesinden gelemez.

Float degiskenler uzerinde logic islemler yapilabilirmi? Derleyicinin hata vermesi lazim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Burak B

#11
Alıntı yapılan: z - 29 Mayıs 2014, 22:29:01
Float degiskenler uzerinde logic islemler yapilabilirmi? Derleyicinin hata vermesi lazim.

Bende bilmiyorum bir deneyin hocam sonucu bizimle paylaşın. Hatta eğer hata veriyorsa float değişkenleri XOR etmek mümkün müdür acaba ? Yada bu mantıklı mıdır ?
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Tagli

Bence mümkündür ancak mantıklı değildir. Derleyici bunları iki tane 32 bitlik veri gibi görür ve XOR yapar. Çıkan sonucun da hiçbir anlamı olmaz. Bence hata değil ama uyarı vermesi gerekir.
Gökçe Tağlıoğlu

Burak B

Aslında integral veri türü gerektirdiğine dair hata verir. Yani @z hocam haklı. Ayrıca float sayıların XOR edilmesi anlamsız olduğundan derleyiciler ve ben yukarıda hernekadar aksini belirtmiş gibi görünsemde (sadece acaba kim araştıracak diye düşünmüştüm.) PC-Lint gibi static analiz araçları buna müsade etmez. Ancak her ne kadar mantıksız olsa da yapılamaz ve her derleyici tarafından algılanabilir değildir.

float işlemler için XOR bu sebeple tanımlanmamıştır. Ama ben psikopatım ve bunu yapacam derseniz yapılır. Buna benzer birşeyde '%' mod operatörüdür. ama bunun için fonksiyon fmod() kullanımı vardır. Çünkü float sayılarda mod mantıklı bir işlemdir.

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Kaanx

Arkadaşlar yorumlara göre ortaya cıkan formul ve ortamdaki ozon miktarını hesaplayıp PPB değerini gösteren formülüm

//VARIABLES FOR OZONE SENSOR   
float Vc=0.0;
float ratio=0.0;
float x=0.0;
float ppbvalue=0.0;
float ppb=0.0;
float c=1.505;
float m=-0.903;
float Ro=23850.0;

float Rs=0.0;
float Rl=10000.0; //or 20000k  ohm 

  //MQ-131 Ozone Sensor Read  
   float Vc=5.0*analogRead(Ozone_sensor_pin)/1024;
  Rs=(float)(5.0/Vc-1)*Rl;
  
  ratio=(float)Rs/Ro;
  x=pow(10,-c);
  
  ppbvalue=ratio*x;
  ppb=(float)pow(ppbvalue,1/m);


Sadece formülazasyon kısmı burada bu kod arduino içinde yazılmıstır.

Kullanılan sensörün datasheet i ----> https://www.futurlec.com/Datasheet/Sensor/MQ-131.pdf

Bu sensör için verilen grafiğe göre formül çıkardım ve değerlerim yukarıda bulabilirsiniz. Bana göre formül güzel çalışmıyor. yani İstediğim değerleri göremiyorum absürd degerleri gördüm hep , Ro hesaplayamadım sabit değer alıyorum sürekli 20 k ohm civarı ve RL yide aynı şekilde kafama göre 10k yada 20 k alarak işlemlerimi yapıyorum. Belkide sorun katsayılarımda da olabilir bilemiyorum vakti olan varsa ilgilenebilirse cok makbule geçer. Datasheette grafik logaritmik kagıda yazılmıs yani çözerken ona dikkat ederek çözebilirisniz
logaritmik kagıt ile ilgili ders içinde ---> https://www.lhup.edu/~dsimanek/scenario/errorman/graphs2.htm linkini kullanabilirsiniz. Şimdiden teşekkür ediyorum