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: 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 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.33333333333333333333333333333integral(fun,0,4)sayısal integraldir.int(y,0,4)sembolik integraldir.vpasembolik 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 gibiprettyçıktıyı daha okunur biçimde gösterir (metin tabanlı).
Binom açılımı:
%% (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 gibi5) 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: 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 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.60618) 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. .
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. derecedenode45: 4. ve 5. dereceden
Aşağıdaki örnekte ode23 ile 'dan '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