Delphi 7-12 Bilinmeyenli 12 Denklem

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
busranas
Üye
Mesajlar: 6
Kayıt: 11 Oca 2019 11:02

Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen busranas »

Merhabalar ismim Büşra
İnşaat Mühendisliği yüksek lisans öğrencisiyim. Danışman hocamızın bir dersi Delphi. Lisansımda da programlama derslerinde hep zorlanmışımdır. Şuanda da Delphi de çok zorlanıyorum. Nümerik formülleriyle çözüme ulaştırdığımız denklemleri delphiye dökmem gerekiyor. 4 Soru var toplamda bir noktaya kadar geliyorum ama sonra ne yapacağımı bilemiyorum.

Örneğin
Bir levha var elimizde bunun eni boyu ve levhayı kaça bölümlendireceğimiz hepsi değişken olacak.
Eni 3 mt Boyu 2.4 mt bir levha olsun
Sağdan soldan alttan ve üstten bu levhaya giren sıcaklıklarda değişken olacak.
Ve bu levha Dx=0,6 mt olarak bölümlendirilsin. Bölümlendirdiğim her noktadaki sıcaklıklar benden istenen oluyor.
Ben bunu Laplace denklemi yardımıyla çözüme ulaştırıyorum. Zaten bir dersimizde Nümerik hidrolik ve onun ödevi de elimizle çözmek. Fakat programa aktaramıyorum. En boy sıcaklıklar aralıklar bütün hepsini edit olarak açıyorum butona tıklayınca bana bilinmeyen nokta sayısını veriyor oraya kadar herşey tamam :) 12 bilinmeyen nokta sayısı oluyor. Bu 12 bilinmeyenin nümerik denklemlerini yazıp showmessage da çıkartabilir miyim ekrana? Memo da gösterebilir miyim? Başka değerler girilince başka bilinmeyen sayıları çıkacak örneğin 20. Burada tıkanıyorum ve ne yapacağımı bilemiyorum. Derste hoca çok ama çok az gösterdi 1300 sayfalık bir pdf verdi ve buyrun yapın dedi. Yardımcı olabilirseniz çok sevinirim. Şimdiden teşekkürler
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen me_turan@mynet.com »

Ornek bir soru yaz ve sonra cozumunu goster. Yasadigin skintilari cok guzel anlatmissin ama keske sadece soru ve cozumu yazsaymissin :) bu sekilde koda dokebilirdik. Bolumlendirdigin her noktadaki sicaklik isteniyrmus. Bu sicakligin nasil hesaplandiginin formulunu yazarsan kolayca delphi koduna donusturebiliriz.
busranas
Üye
Mesajlar: 6
Kayıt: 11 Oca 2019 11:02

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen busranas »

Örnek şu şekilde
Aşağıda verilen Laplace denklemi ile tarif olunan fiziksel olayları modellemede kullanılacak sayısal modeli oluşturunuz. Laplace denkleminin çözümünde merkezi öteleme fark formülü kullanılacaktır. Model delphi ortamında yazılacaktır.
∂²T/∂x²+∂²T/∂y²=0

Dediğim gibi bu laplace denkleminin çözümünü merkezi öteleme fark formülü ile ben elde ettim. Burada tüm değerler değişken olacak elimdeki bir adet örnek var 3e 2,4 genişliğinde levha. Sağından 100, Solundan 75, üstünden 300, altından 50 derece ısıtılıyor. Bu levhayı dx=dy=0,6 mt bölümlendirerek her noktadaki sıcaklık değerlerini bulunuz.
Her noktadaki sıcaklık değerlerinin formülü :
1. 4T1,1 = T0,1 + T1,2 + T2,1 + T1,0
2. 4T1,2 = T0,2 + T1,3 + T2,2 + T1,1
3. 4T1,3 = T0,3 + T1,4 + T2,3 + T1,2
4. 4T1,4 = T0,4 + T1,5 + T2,4 + T1,3
5. 4T2,1 = T1,1 + T2,2 + T3,1 + T2,0
6. 4T2,2 = T1,2 + T2,3 + T3,2 + T2,1
7. 4T2,3 = T1,3 + T2,4 + T3,3 + T2,2
8. 4T2,4 = T1,4 + T2,5 + T3,4 + T2,3
9. 4T3,1 = T2,1 + T3,2 + T4,1 + T3,0
10. 4T3,2 = T2,2 + T3,3 + T4,2 + T3,1
11. 4T3,3 = T2,3 + T3,4 + T4,3 + T3,2
12. 4T3,4 = T2,4 + T3,5 + T4,4 + T3,3

Bu formülde
https://i.hizliresim.com/dvXr9n.jpg

görüldüğü gibi sınır değerlerin sıcaklığını biliyoruz maviye boyadım. orta değerleri bilmiyoruz toplam 12 adet var. Nümerik yöntemlerde benim çözümüm her noktaya bir değer vermekle başlıyor ve yaklaşık 60 iterasyon sonunda gerçek değere yakın değeri veriyor. Ben bunu excell ile yaptım.
https://i.hizliresim.com/oXE51R.jpg

https://i.hizliresim.com/XMdGm0.jpg

Görüldüğü gibi excelde formülü yerine koyarak 1. iterasyonda tahmini değerleri alıp 2. iterasyonda bir önceki değerleri alıp bu şekilde 0,001 hataya ulaşana kadar iterasyon yaptığımda yaklaşık 50-60 iterasyon arasında istenen değerlere ulaşıyorum.

[https://i.hizliresim.com/mMEbmY.jpg

Delphi de geldiğim aşama ise :

https://i.hizliresim.com/9aGzyo.jpg

Button 1 e tıkladığımda gayet basit bir matematik işlemini çözdürebildim. Yani dx dy 'ye eni boyu böldürüp kaç bilinmeyen olduğunu, en nokta sayısını ve boy nokta sayısını buldurabildim. Bu aşamadan sonra ne yapacağım hakkında fikrim yok.
En son busranas tarafından 15 Oca 2019 01:01 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen me_turan@mynet.com »

:) Senin uzmanlik alaninla ilgili anlayamadigim cok fazla semboller ve terimler olsada ana fikri anladim sanirim. Oncelikle ben tek bir formul bekliyrdum. Ama burada ard arda yapilmasi gereken bir islem sirasi var. Anladigim gibiyse eger cok kolay ittire ittire iterasyon yapicaz :)

iki yolu var cift boyutlu dizi olusturmak yada delphideki stringrid componentini kullanmak. Biz gorsel olarak yapalim madem. Senin icin daha az karmasik olur.
Once mantigini anlatayim sonra kodlari yazarim. Oncelikle kac hucreli bir tabloya ihtiyac duydugumuzu bulacagiz. Sonra tabloda bilinen alanlari dolduracagiz. Ustten verilen isi icin ust hucreler, sagdan verilen isi icin sag hucreler ve ayni sekilde sol ve alt hucreleride bilinen degerlerle dolduracagiz. Sonra bilmedigimiz tum hucreleri 0 ile dolduracagiz. Bikinmeyen ilk hucreden baslayacagiz. Cevresindeki 4 hucrenin isi degerlerini toplayip 4 e bolecegiz. Boylece ilk verdigimiz sifir degerlerinin tamami degismis olacak. Ilk ittirasonu yapmis olacagiz. Bu islemi for dongusu icine alip istedigimiz kadar tekrarlatabiliriz. Hassasiyet derecesi de isteriz formda. Bir onceki ittirasyon ile arasinda en fazla ne kadar fark olacaksa o zaman ittirasyon durur.

Kod: Tümünü seç

Var 
boy,en, dx,dy:real; 
Hassasiyet:real; //ulasmak istedigimiz hassasiyet orani
Ustisi,altisi,sagisi,solisi, say:integer;
i,j,k,fark,enfark,xx,yy:real;
Begin
Boy:=3; en:=2,4; dx:=0,6; dy:=0,6; 
Say:=0;
Hassasiyet := 0,000001;
xx := ( boy - (boy mod dx)) / dx ; 
yy:= (en - (en mod dy) / dy;
Stringgrid1.rowcount := xx; // satir sayisi
Stringrid1.colcount := yy; sutun sayisi
For i := 0 to yy do
Begin
  Stringrid1.cells[0,i]:= ustisi;
  Stringrid1.cells[xx,i]:= altisi;
End;
For i:=0 to xx do
Begin
 Stringrid1.cells[i,0):= ,i]:= sagisi;
  Stringrid1.cells[i,yy]:= altisi;
End ;
/// bilinen sicakliklari hucrelere doldurduk simdi bilinmeyenleri 0 yapalim
For i:= 1 to xx-1 do
For k:= 1 to yy-1 do
Begin
 Stringrid1.cells[i,k] := '0';
End;
// simdi itrasyonlari yapalim.. 
While hassasiyet < enfark do 
Begin
Say :=say +1;
 For i:= 1 to xx-1 do
 For k:= 1 to yy-1 do
  Begin
J:=strtofloat(stribgrid1.cells[i,k]); //ilk deger
 Stringrid1.cells[i,k]:=floattostr(
                                    ( strtofloat(stringrid1.cells[i-1]) +
                                     strtofloat(stringrid1.cells[i+1]) +
                                     strtofloat(stringrid1.cells[k-1]) +
                                     strtofloat(stringrid1.cells[k+1]) ) / 4
                                                       );

Fark :=strtofloat(stribgrid1.cells[i,k]) - j ; // itirasyon sonrasi hucredeki fark

If fark < 0 then 
fark := fark * -1 ; // fark hep pozitif olmali (mutlak).. 

If fark > enfark then // olusan en buyuk farki buluyruz. 
Enfark := fark ; 
End;

End;/// while endi..
Showmessage (inttostr(say) + ' adet itirasyon sonucunda ' + floattostr(hassasiyet) + ' hassasiyetle tespit edilmistir.' );
End;
Bu arada cok ilginc bir hesaplama yontemiymis. Boyle bir hesaplama yontemi oldugunu bilmiyrdum. Surekli yeniden tahmin ediyor ve bir onceki tahminle arasinda ayni kabul edilebilecek kadar kucuk bir fark bulana kadar devam ediyor. Sonunda cevabi buluyor. Harikaymis. Sevdim bunu...
En son me_turan@mynet.com tarafından 13 Oca 2019 12:30 tarihinde düzenlendi, toplamda 5 kere düzenlendi.
busranas
Üye
Mesajlar: 6
Kayıt: 11 Oca 2019 11:02

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen busranas »

teşekkür ediyorum ilginiz için. bende sizin yazdıklarınızı uygulamaya çalışacağım.
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen me_turan@mynet.com »

Tamamdir. Cepten yazdigim icin yazim hatalari olabilir. Duzeltirsin hatali yer varsa ama mantik bu. Kolay gelsin..

Ayrica eger iterasyon sayisini dusurmek istersen sanirim baslangic degerlerini 0 yapmayabilirsin. Cevresindeki bilinen iki noktanin ortalamasini baslangic degeri olarak kabul edersen daha hizli sonuc verir.
busranas
Üye
Mesajlar: 6
Kayıt: 11 Oca 2019 11:02

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen busranas »

Öncelikle kodlar için çok teşekkür ederim. Kodların bazı yerlerini düzenleyerek kendi yaptığıma göre, programı çalıştırdım.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
boy,en,dx,dy,ens,bns,bs:real;
Hassasiyet:real; //ulasmak istedigimiz hassasiyet orani
ustisi,altisi,sagisi,solisi, say:integer;
fark,enfark,xx,yy:real;
i,j,k:integer;
Begin
en:=strtofloat(edit5.Text);
boy:=strtofloat(edit6.Text);
dx:=strtofloat(edit7.Text);
dy:=strtofloat(edit8.Text);

ens:=(en/dx)+1;
bns:=(boy/dy)+1;
bs:=(ens-2)*(bns-2);
edit9.text:=floattostr(ens);
edit10.text:=floattostr(bns);
edit11.text:=floattostr(bs);

Say:=0;
Hassasiyet := 0.000001;
xx := ( boy / dx)-1 ;
yy:= (en / dy)-1;
Stringgrid1.rowcount := Round(xx); // satir sayisi
Stringgrid1.colcount := Round(yy); //sutun sayisi
for i := 0 to Round(yy) do
Begin
  Stringgrid1.cells[0,i] := edit1.Text;
  Stringgrid1.cells[Round(xx),i] := edit2.Text;
End;
For i:=0 to Round(xx) do
Begin
 Stringgrid1.cells[i,0] := edit3.Text;
  Stringgrid1.cells[i,Round(yy)] := edit4.Text;
End ;
/// bilinen sicakliklari hucrelere doldurduk simdi bilinmeyenleri 0 yapalim
For i:= 1 to Round(xx)-1 do
For k:= 1 to Round(yy)-1 do
Begin
 Stringgrid1.cells[i,k] := '0';
End;
// simdi itrasyonlari yapalim.. 
While hassasiyet < enfark do
Begin
Say :=say +1;
 For i:= 1 to Round(xx)+1 do
 For k:= 1 to Round(yy)+1 do
  Begin
J:=strtoint(stringgrid1.cells[i,k]); //ilk deger
 Stringgrid1.cells[i,k]:=floattostr(
                                    ( strtoint(stringgrid1.cells[i-1,k]) +
                                     strtoint(stringgrid1.cells[i+1,k]) +
                                     strtoint(stringgrid1.cells[i,k-1]) +
                                     strtoint(stringgrid1.cells[i,k+1]) ) / 4
                                                       );

Fark :=strtoint(stringgrid1.cells[i,k]) - j ; // itirasyon sonrasi hucredeki fark

If fark < 0 then
fark := fark * -1 ; // fark hep pozitif olmali (mutlak)..

If fark > enfark then // olusan en buyuk farki buluyruz.
Enfark := fark ;
End;

End;/// while endi..
Showmessage (inttostr(say) + ' adet itirasyon sonucunda ' + floattostr(hassasiyet) + ' hassasiyetle tespit edilmistir.' );
End;

end.
Fakat tablolamada hata çıkıyor.
https://i.hizliresim.com/RrQ7GG.jpg

Değerlerin

https://i.hizliresim.com/mMEbmY.jpg

bu şekilde çıkması gerekiyor

edit: FreeMan35 Mahsuru yoksa hiyeroglif değilde Atatürk'ün öğretiği Türkçe ile derdinizi anlatın. İllaki resim ekliyecekseniz, tag larını kaldırıp ekleyin.
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen me_turan@mynet.com »

Yarin delphide yazip calisan seklini gondrririm.
me_turan@mynet.com
Üye
Mesajlar: 29
Kayıt: 09 Eyl 2017 02:53

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen me_turan@mynet.com »

procedure TForm3.Button1Click(Sender: TObject);
Var
boy,en, dx,dy:real;
Hassasiyet,j,fark,enfark:real; //ulasmak istedigimiz hassasiyet orani
ustisi,altisi,sagisi,solisi, say:integer;
i,k,xx,yy:integer;
Begin
Boy:=strtofloat(edit1.Text); en:=strtofloat(edit2.Text);
dx:=strtofloat(edit3.Text); dy:=strtofloat(edit4.Text);
ustisi := strtoint(edit5.Text); altisi := strtoint(edit6.Text);
sagisi := strtoint(edit7.Text); solisi := strtoint(edit8.Text);
Say:=0; enfark := 9999; // en farkın başlangıc değeri yüksek olsun
Hassasiyet :=strtofloat(edit9.Text);

xx := strtoint(floattostr(boy / dx))+1 ;
yy:= strtoint(floattostr(en / dy))+1;

Stringgrid1.rowcount := xx; // satir sayisi
Stringgrid1.colcount := yy; // sutun sayisi
StringGrid1.Refresh;
/// şimdi bilinen değerleri giriyor.
For i := 0 to yy-1 do
Begin
Stringgrid1.cells[i,0]:= inttostr(ustisi);
Stringgrid1.cells[i,xx-1]:= inttostr(altisi);
End;
For i:=0 to xx-1 do
Begin
Stringgrid1.cells[yy-1,i]:= inttostr(sagisi);
Stringgrid1.cells[0,i]:= inttostr(solisi);
End ;

// hücreleri 0 ile dolduruyoruz
For i:= 1 to xx-2 do
For k:= 1 to yy-2 do
Begin
Stringgrid1.cells[k,i] := floattostr((ustisi + altisi+ sagisi+solisi)/4);
End;

// simdi itrasyonlari yapalim..
While hassasiyet < enfark do
//while say < 300 do
Begin
enfark := 0; // döngü icine girince fark olmadığını kabul edelim.
Say :=say +1;
For i:= 1 to yy-2 do
For k:= 1 to xx-2 do
Begin
J:=strtofloat(Stringgrid1.cells[i,k]); //ilk deger
///ShowMessage(floattostr(j));
Stringgrid1.cells[i,k]:=floattostr((strtofloat(Stringgrid1.cells[i-1,k]) +
strtofloat(Stringgrid1.cells[i+1,k]) +
strtofloat(Stringgrid1.cells[i,k-1]) +
strtofloat(Stringgrid1.cells[i,k+1]) ) / 4
);
Fark :=strtofloat(Stringgrid1.cells[i,k]) - j ; // itirasyon sonrasi hucredeki fark
If fark < 0 then
fark := fark * -1 ; // fark hep pozitif olmali (mutlak)..

End;
If fark > enfark then // olusan en buyuk farki buluyruz.
Enfark := fark ;

End;/// while endi..
Showmessage (inttostr(say) + ' adet itirasyon sonucunda ' + floattostr(hassasiyet) + ' hassasiyetle tespit edilmistir.' );
end;

"BU BÖLÜME RESİM KOYMUŞTUM AMA FORUM KURALLARI GEREĞİ RESİM KOYMAK YASAKMIŞ. UYARI ALDIM VE RESMİ KALDIRDIM... "

cep telefonundan yazdığımda bir sürü hata yapmışım. :shock:
düzeltmeleri yaptım. yukardaki kodda hata yok.
En son me_turan@mynet.com tarafından 15 Oca 2019 11:31 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
busranas
Üye
Mesajlar: 6
Kayıt: 11 Oca 2019 11:02

Re: Delphi 7-12 Bilinmeyenli 12 Denklem

Mesaj gönderen busranas »

Çok ama çok teşekkür ederim.
Cevapla