Bu blogda Müller Yöntemi (Muller Method) kullanılarak C üzerinde örnek çözümü yapılmıştır. Kod içerisinde her satıra ilişkin açıklama yorum kısmında belirtilmiştir. Çözümlenen örneğin bulunduğu kaynak blogun sonunda belirtilmiştir. (Sayfa 97 – Algoritma 2.8)
Örnek:
fonksiyonu için grafik yanda verilmiştir. Bu fonksiyonda P0=0.5 P1=-0.5 P2=0.0 değerleri için hata payı ile müller yöntemi kullanılarak iterasyon yapılmıştır.
C Kod:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | #include <stdio.h> #include <stdlib.h> #include <math.h> #include <complex.h> #define MAX 100 // Programın durması için Max döngü sayısı double complex f(double complex x) // Çözümlenen Fonksiyon x^4-3*x^3+x^2+1 { return x*x*x*x-3*x*x*x+x*x+x+1; } double complex cozumkumesi(double complex p0, double complex p1, double complex p2, double tolerance) { printf("\n\t\t\tP0=%.1f P1=%.1f P2=%.1f Tolerance=%.5f\n\n",creal(p0),creal(p1),creal(p2),tolerance); printf(" i\t\tP\t\t\tf(P)\t\t\tTOLERANCE\n"); printf("___\t____________________\t ____________________\t\t_________\n"); double complex E,h,p,D,b; // Kullanılan karmaşık sayı değişkenleri double complex h1=p1-p0; // p1-p0 Nokta farkları h1'e atanır. double complex h2=p2-p1; // p2-p1 Nokta farkları h1'e atanır. double complex r1=(f(p1)-f(p0))/h1; // p1-p2 nokta yükeksik farklarının uzaklığa oranı r1'e atanır. double complex r2=(f(p2)-f(p1))/h2; // p2-p1 nokta yükeksik farklarının uzaklığa oranı r2'ye atanır. double complex d=(r2-r1)/(h2+h1); // Benzetilen parabol için C sayısı elde edilir. int i=3; // İlk 3 noktası biliniyor. while(i<=MAX) { b=r2+h2*d; // Benzetilen parabol için B sayısı elde edilir. D=csqrt(b*b-4*f(p2)*d); // Benzetilen parabol için Kök(b^2-4ac) ifadesi çıkartılır. if(cabs(b-D)<=cabs(b+D)) E=b+D; else E=b-D; // b-D & b+D mutlak kıyaslamasından E çıkartılır. h=f(p2)*(-2)/E; // Benzetilen parabol için -2a/E h'ye atanır. p=p2+h; // 3. noktanın elde edilen h ile toplamından nokta elde edilir. if (cimag(p) == 0) // Elde edilen noktanın karmaşık olma durumu incelenir. printf(" %d\t%.5f\t\t\t %.5f\t\t\t%.7f\n",i,creal(p),creal(f(p)),sqrt(pow(creal(h),2)+pow(cimag(h),2))); else printf(" %d\t%.5f + %.5fi \t %.5f + %.5fi \t\t%.7f\n",i,creal(p),cimag(p),creal(f(p)),cimag(f(p)),sqrt(pow(creal(h),2)+pow(cimag(h),2))); if((pow(creal(h),2)+pow(cimag(h),2))<=(pow(tolerance,2))) break; // Karmaşık sayı büyüklüğü hata sınırında ise işlem biter. p0=p1; // eski p1 sayısı yeni p0'a kaydırılır. p1=p2; // eski p2 sayısı p1'e kaydırılır. p2=p; // eski p2 yerine yeni p atanır. h1=p1-p0; // yeni sayılar için h1 h2=p2-p1; // yeni sayılar için h2 r1=(f(p1)-f(p0))/h1; // yeni sayılar için r1 r2=(f(p2)-f(p1))/h2; // yeni sayılar için r2 d=(r2-r1)/(h2+h1); // yeni sayılar için d i++; // Nokta sırası } printf("______________________________________________________________________________\n\n"); } int main() { cozumkumesi(0.5,-0.5,0,0.00001); // Tablo Çıktısı. cozumkumesi(0.5,1.0,1.5,0.00001); // Tablo Çıktısı. cozumkumesi(1.5,2,2.5,0.00001); // Tablo Çıktısı. return 0; } |
Konsol Çıktısı:
Yararlanılan Kaynak:
Numerical Analysis
NINTH EDITION
Richard L. Burden (Youngstown State University)
J. Douglas Faires (Youngstown State University)
1 comments: On C Kod ile Müller Yöntemi (Muller Method)
Hocam tam adam ne güzel yazmış bir bakayım geçmişine dedim Gebze Teknik Üni. elektronik mezunu olduğunu görünce bir gülümseme geldi 🙂 Ben de Gebze Teknik Elektronikteyim iyi denk gelmiş.