Back to Notes
MATLAB

MATLAB Symbolic Math, Polinomlar ve Diferansiyel Denklemler

MATLAB Ders Notları: Symbolic, Polinomlar ve Diferansiyel Denklemler

  • Denklem çözümü, türev, integral, sadeleştirme işlemlerini,
  • Polinomlarla çalışma (değer hesaplama, kök bulma, çarpma/bölme, türev/integral),
  • Doğrusal olmayan denklem takımlarının fsolve ile çözümünü,
  • ODE (Adi Diferansiyel Denklem) türlerini ve dsolve / ode23 gibi yöntemleri

1) Symbolic Temeller: Çözüm, Türev, İntegral

MATLAB'de sembolik değişken tanımlamak için syms kullanılır. Bu sayede polinom gibi ifadeler üzerinde analitik işlem yapabilirsiniz.

Örnek: y=4x38x2+5x+17y = 4x^3 - 8x^2 + 5x + 17 denklemini çözünüz

% örnek: y=4x^3 - 8x^2 + 5*x + 17 denklemini çözünüz.
 
clear all, close all, clc
%%
 
syms x y
y=4*x^3 - 8*x^2 + 5*x + 17;
 
solve(y)
diff(y)
int(y)
simplify(y)
 
%%
  • solve(y) ifadesi y=0y=0 denkleminin köklerini çözer.
  • diff(y) türev alır.
  • int(y) belirsiz integral alır.
  • simplify(y) ifadeyi mümkünse sadeleştirir.

2) İki Değişkenli Fonksiyonlarda Kısmi Türev

İki değişkenli bir fonksiyon için diff(f,x) ve diff(f,y) ile kısmi türevler alınır.

% ÖRNEK: f = -1*(x^2+y)^2+exp(0.1*(x+y))
syms f(x,y)
f(x,y) = -1*(x^2+y)^2+exp(0.1*(x+y));
diff(f,x)
diff(f,y)
%%

3) Numerik İntegral ve Sembolik İntegral Karşılaştırması

Aynı fonksiyonun integrali hem numerik (yaklaşık) hem sembolik (tam) hesaplanabilir.

%Numerik İntegral
syms x y
fun = @(x) (4.*x.^3 - 8.*x.^2 + 5.*x + 17); % "." ile beraber matris çarpımı sağlıyoruz.
% Konmazsa matrislerde sadece birinci elemanı birinci ile çarpar bırakır
q = integral(fun,0,4) % 0 ile 4 arasında integralini aldık.   ans = 193.3333
y=4*x^3 - 8*x^2 + 5*x + 17;
w = int(y, 0, 4) % ans= 580/3
vpa(w) % ans = 193.33333333333333333333333333333
  • integral(fun,0,4) sayısal integraldir.
  • int(y,0,4) sembolik integraldir.
  • vpa sembolik sonucu istenen hassasiyette ondalığa çevirir.

4) Sadeleştirme ve Üslü İfade Açılımı

Sadeleştirme

%% Sadeleştirme
clear all, close all, clc
syms a b
f1 = (a^2-4*b^2)/(a-2*b);
simplify(f1) % a + 2*b sadeleştiriyor denklemi en basit haline
pretty(f1) % ans = Kesirli olarak gösteriyor. \frac gibi
  • pretty çıktıyı daha okunur biçimde gösterir (metin tabanlı).

Binom açılımı: (ab)5(a-b)^5

%% (a-b)^5 oalrak verilen üslü ifadeyi açınız.
clear all, close all, clc
syms a b
f2 = (a-b)^5;
expand(f2) % ans = a^5 - 5*a^4*b + 10*a^3*b^2 - 10*a^2*b^3 + 5*a*b^4 - b^5
pretty(expand(f2)) %% Yine daha güzel yazıyor. 5*a değil 5a veya a^2 değil ^ koymadan üstüne gibi

5) Sembolik Toplam: Seri Hesabı

%% 4x5x6+5x6x7+...+98x99x100 serisinin toplamını hesaplayınız.
clear all, close all, clc
syms k
symsum(k*(k+1)*(k+2),4,98) % ans = 24497460 symsum(fonksiyon,ilk değer,son değer)

6) Polinomlar: Değer, Kök, Üretim ve Operasyonlar

MATLAB’de polinomlar çoğunlukla katsayı vektörüyle ifade edilir:

  • Değer hesaplama: polyval(p, x0)
  • Kök bulma: roots(p)
  • Köklerden polinom üretme: poly(r)
  • Çarpma: conv(p,q)
  • Bölme: [bolum, kalan] = deconv(p,q)
  • Türev: polyder(p)
  • İntegral: polyint(p)

Örnek: x=s4+3s315s22s+9x = s^4+3s^3-15s^2-2s+9 için değer ve kökler

%% Polinomlar
% Değişkenin herhangi bir değeri için polinomun değeri bulunmak istenirse
% polyval(x,...) kullanılır.
 
% x polinomunun kökleri roots(x) ile hesaplanır.
 
% kökleri verilen bir polinomu üretmek için poly() kullanılmaktadır.
 
% iki polinom çarpımı için z = conv(x,y) ve bölmek için
% [bolum,kalan]=deconv(x,y) kullanılmaktadır.
 
% polinomların toplamı için t=x+y veya çıkartma için t=x-y
% kullanılmaktadır.
 
clear all, close all, clc
 
% Örnek: x = s^4+3s^3-15s^2-2s+9 polinomunun s=2 ikenki değerini, kökünü
% bulunuz.
syms x s
x=[1 3 -15 -2 9]; % Matlabde polinom yazarken bu şekilde bir vektörle ifade edebiliriz.
polyval(x,2) % -15
q=roots(x) %   -5.5745
         %   2.5836
         %   -0.7951
         %   0.7860
poly(q) % ans = 1.0000    3.0000  -15.0000   -2.0000    9.0000
 
% Bu polinomu fonksiyon olarak çözelim aynı soru için.
clc
f = s^4+3*s^3-15*s^2-2*s+9;
subs(f,s,2) % ans = -15, f fonksiyonunda s yerine 2 yaz ve sonucu ver.
 
clc
% Polinom çarpımı bölümü
x=[1 3 -15 -2 9];
y = [1 0 0 0 1];
 
z=conv(x,y) % [1     3   -15    -2    10     3   -15    -2     9] s^8 lik bir polinom vermiş.
[bolum,kalan]=deconv(x,y) % bolum 1, kalan = [0     3   -15    -2     8] s^4 lük bir polinom. s^4'ün katsayı yok yani s^3müş
f= polyder(x) % [4     9   -30    -2] polinomun fonksiyonun 1.türevini alıyor. Daha fazla almak için polyder(f) ile devams.
f=polyint(x) % [0.2000    0.7500   -5.0000   -1.0000    9.0000         0] polinom integral dışına böyle çıkıyor imiş.
 
% f(x,y) gibi iki değişkenli fonksiyonların integrali
% dblquad(fonksiyon,xmin,xmax,ymin,ymax) şeklinde hesaplanır.
 
% Bir polinomda x değişkeni 0'a yaklaşırken polinomun değeri şu şekilde
% hesaplanır: limit(f)
% Bir polinomda x değişkeni 3'e yaklaşırken polinomun değeri şu şekilde
% hesaplanır: limit(f,3)

7) Doğrusal Olmayan Denklem Takımları: fsolve

fsolve, bilinmeyenlerin bulunduğu bir denklem takımını sayısal olarak çözer. Burada kritik nokta: denklemler F(x)=0F(x)=0 formuna getirilmelidir ve genelde bir fonksiyon dosyasında (m-file) tanımlanır.

%% Doğrusal Olmayan Denklem Takımlarının Çözümü
% x = fsolve('fun',x0) komutu kullanılır. fun ile belirtilen ise çözülecek
% denklemlerdir ve bir m file içerisine yazılmalıdır. x0 tahmini başlangıç
% değerleridir. x0 boyutu x değişken sayısı kadar olmalıdır.
 
clear all, close all,clc
 
% Örnek: e^(-e)^(-x-y) = y(x^2+1) ve xcos(y) + ysin(x) = 1/2 denklemlerini
% çözünüz.
% Çözüm: Denklemler nonlineerdir. fsolve komutu kullanılacaktır. Öncelikle
% F(x)=0 formuna getirilmelidir.
% e^(-e)^(-x-y) - y(x^2+1) = 0
% xcos(y) + ysin(x) - 1/2 = 0
% Bir m file içerisine denklemler aşağıdaki gibi yazılmalıdır. Bu m file,
% matlabda, şimdiki çalışma klasörünün içerisinde olmalıdır.
% function F = root2d(x) %function adı root2d olarak girildi
% F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+(x(1)^2); %x değişkeni x(1), y
% değişkeni x(2)
% F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
 
fun = @root2d;
x0 = [0,0]; % Başlangıç değerleri
x = fsolve(fun,x0) % ans = 0.3532    0.6061

8) Adi Diferansiyel Denklemler (ODE): Türler ve Sembolik Çözüm

ODE Türleri (Kısa Özet)

  • Başlangıç değer problemi (IVP): Şartlar yalnız başlangıçta verilir (Euler, Runge-Kutta).
  • Sınır değer problemi (BVP): Şartlar başlangıç ve bitişte verilir (Shooting, FDM, FEM).
  • Özdeğer problemi: Özel bir BVP türü, ör. (Aω)x=0(A-\omega)x=0.

Sembolik çözüm: dsolve

Sembolik ODE çözerken syms y(t) ile fonksiyonun hangi değişkene bağlı olduğunu belirtmek iyi pratiktir.

%% Adi Diferansiyel Denklemlem Türleri
 
% Başlangıç değer problemi: Sınr şartları sadece başlangıç  noktasında
% verilir. Sayısal çözüm yöntemleri: Runge Kutta yöntemi, Euler yöntemi
 
% Sınır değer problemi: Sınır şartları hem başlangıç hem de bitiş
% noktasında verilir. Sayısal çözüm yöntemleri: Atma yöntemi, sonlu fark
% yöntemi, sonlu eleman yöntemi
 
% Özdeğer problemi: Sınır değer problemlerinin özel bir türüdür. (A-w)*x=0
% türündeki problemler. Sayısal çözüm yöntemleri: Sonlu fark yöntemi, sonlu
% eleman yöntemi
 
% Diferansiyel denklemlerde bulunan diferansiyel operatörlü ifadeler
% dy/dx=dfiff(y) biçiminde yazılmalıdır.
% Öncesinde de y'nin x'e olan bağlılığı syms y(x) ile belirtilmelidir.
 
% Örnek1: (3*x^5*y^5-2y)dx+(5*x^6*y^4+x)dy=0 olarak verilen diferansiyel
% denklemini çözünüz.
% dx ve dy'ler farklı yerlerde bunları dy/dx olacak şekilde toplayalım ve
% buna diff(y) diyelim.
syms y(x)
eqn = (3*x^5*y^5-2*y) + diff(y)*(5*x^6*y^4+x) == 0;
S = vpa(dsolve(eqn))
 
% Örnek2: dy/dt = ay denklemini çözünüz.
syms y(t) a
eqn = diff(y,t) == a*y
S = vpa(dsolve(eqn))
 
%% Örnek3: d^2y/dt^2 = a*y denklemini çözünüz.
clear all, close all, clc
syms y(t) a
eqn = diff(y,t,2) == a*y;
S = vpa(dsolve(eqn));
 
% Örnek4: dy/dt = ay denkleminde y(0) = 5 olduğu bilinmektedir.
% Diferansiyel denklemi bu başlangıç şartı ile çözünüz.
syms y(t) a
eqn = diff(y,t) == a*y;
cond = y(0)==5;
S = dsolve(eqn,cond);
 
% Örnek5: d^2y/dt^2 = a^2y denkleminde y(0)=b ve y'(0)=1 olduğu
% bilinmektedir. Diferansiyel denklemi bu başlangıç şartları ile çözünüz.
% Bilgi: Mertebesi kadar en az başlangıç bilgisi olması lazım çözmek için.
syms y(t) a b
eqn = diff(y,t,2) == a^2*y;
e=diff(y,t);
cond=[y(0)==b e(0)==1];
S = dsolve(eqn, cond);
 
%% Örnek6: dy(t)/dt = e^(-y(t))+y(t) olarak verilen diferansiyel denklemi,
% kapalı olarak (örtük, implicit) çözünüz.
% Diferansiyel denklemin örtük çözümlerini yapmak için, implicit seçeneği
% kullanılmaktadır. Örtük bir çözüm F(y(t))=g(t) biçimindedir.
clc
syms y(t)
eqn = diff(y) == y+exp(-y);
S = dsolve(eqn,'Implicit',true);
pretty(S)
 
%% Örnek 7: dy/dt = y+a/y^(1/2) olarak verilen diferansiyel denklemi, y(a)=1 şartı ile çözünüz.
clc
syms y(t) a
eqn = diff(y,t) == y + a/sqrt(y);
cond = [y(a) == 1]; % y(a) = 1 condition
S = dsolve(eqn, cond);
 
% diff(y,t) ifadesi y fonksiyonunun t değişkenine göre türevini al
% demektir. Eğer syös y(t) diyerek y'nin t'ye bağlı olduğunu belirttiysen,
% diff(y) yazdığında MATLAB varsayılan olarak zaten t'ye göre türev alır.
% Ancak denklemde birden fazla semboilk değişken varsa, diff(y,t) yazmak
% kodun okunabilirliğini artırır ve hata payını sıfıra indirir.
% Matlab'de diff fonksiyonu şu şekilde çalışır
    % * diff(y,t) -> dy/dt
    % * diff(y,a) -> dy/da
    % * diff(y) -> MATLAB, symvar komutuyla bulduğu "en olası" bağımsız
    % değişkene göre türev alır.
 
% a parametresinin tüm olası değerlerini içeren çözümleri elde etmek için,
% IgnoreAnalyticContraints adeğerini false olarak ayarlayarak
% basitleştirmeler kapatılabilir.
yNotSimlified = dsolve(eqn, cond,'IgnoreAnalyticConstraints',false);

9) ODE Sayısal Çözüm: ode23 ile Runge–Kutta

ode23 ve ode45 iki farklı Runge–Kutta çözümleyicidir:

  • ode23: 2. ve 3. dereceden
  • ode45: 4. ve 5. dereceden

Aşağıdaki örnekte ode23 ile t=0t=0'dan t=5t=5'e çözüm alınıp çizdiriliyor:

%% Adi diferansiyel denklemlerin sayısal çözümü
% ode23 ve ode45 adında iki adet Ruge-Kutta yöntemi mevcuttur. ode23 ile
% ikinci ve üçüncü dereceden runge-kutta integrasyon denklemleri
% çözülürken ode45 ile dördüncü ve beşinci dereceden runge-kutta
% integrasyon denklemlerini kullanılmaktadır. Ode fonksiyonlarının genel
% kullanım şekli; [y t]=ode23('denklemler',çözüm aralığı,sınır şartları);
 
% Örnek1: Aşağıdaki doğrusal olmayan, birince mertebe ODE türünde bir
% başlangıç değer (t=0'da y=1) problemini, t=0'dan 5'e kadar çözünüz.
% diff(y)=(-t*y)/(sqrt(2-y^2))
clc
[t,y]=ode23('predprey',[0,5],[1]);
plot(t,y)
 
function F = root2d(x) %function adı root2d olarak girildi
    F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+(x(1)^2)); %x değişkeni x(1), y
    % değişkeni x(2)
    F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;
end
 
function f = predprey(t,y)
f =(-t*y)/(sqrt(2-y^2)); % Türev sola hizalandı
end