Ana Sayfa / MATLAB / Python / Problem 4
Modal Analiz — Özdeğer ve Kütle Katılımı
2 ve 3 katlı kayma binası. Beklenen: ω₁=39.088 rad/s, mod şekli oranı altın oran; 3 katlıda modal katılım toplamı tam %100 (F5 Problem 4-5'ten).
Üçüncü bağlantı: Bu problem sadece ETABS/SAP2000 kıyasına değil,
Yapı Sağlığı İzleme modülüne de bağlanır.
Orada bir ölçüm sinyalinden frekans çıkarıyorduk; burada aynı frekansı
kütle-rijitlik matrislerinden hesaplıyoruz. İkisi aynı fiziksel
büyüklüğü iki tamamen farklı yoldan verir.
PYTHON modal_analysis.py
import numpy as np
# --- 2 katli kayma binasi: ozdeger analizi ---
m = 1000.0 # kg, her kat
k = 4.0e6 # N/m, her kat
M = np.array([[m, 0],
[0, m]])
K = np.array([[2*k, -k],
[-k, k]])
# Genellestirilmis ozdeger problemi: K*phi = w^2 * M*phi
evals, evecs = np.linalg.eig(np.linalg.inv(M).dot(K))
idx = np.argsort(evals)
evals, evecs = evals[idx], evecs[:, idx]
w = np.sqrt(evals) # rad/s
T = 2*np.pi / w # s
print("--- 2 katli bina ---")
for i in range(2):
phi = evecs[:, i] / evecs[0, i] # 1. kat = 1 normalize
print(f"Mod {i+1}: w={w[i]:.3f} rad/s, T={T[i]:.4f} s, sekil=[{phi[0]:.3f}, {phi[1]:.3f}]")
# Analitik dogrulama (esit m,k icin kapali form)
w1_exact = np.sqrt(k/m * (3-np.sqrt(5))/2)
w2_exact = np.sqrt(k/m * (3+np.sqrt(5))/2)
print(f"Analitik: w1={w1_exact:.3f}, w2={w2_exact:.3f} -> "
f"eslesme: {np.allclose([w[0],w[1]],[w1_exact,w2_exact])}")
# --- 3 katli bina: modal kutle katilimi ---
M3 = np.diag([m, m, m])
K3 = np.array([[2*k, -k, 0],
[-k, 2*k, -k],
[0, -k, k]])
evals3, evecs3 = np.linalg.eig(np.linalg.inv(M3).dot(K3))
idx3 = np.argsort(evals3)
evals3, evecs3 = evals3[idx3], evecs3[:, idx3]
w3 = np.sqrt(evals3)
T3 = 2*np.pi / w3
r = np.ones(3) # yatay yer hareketi etki vektoru
total_mass = r.T.dot(M3).dot(r)
print("\n--- 3 katli bina: modal kutle katilimi ---")
cum = 0.0
for i in range(3):
phi = evecs3[:, i]
Mn = phi.T.dot(M3).dot(phi) # modal kutle
Ln = phi.T.dot(M3).dot(r) # modal katilim carpani
Meff = Ln**2 / Mn # etkin modal kutle
ratio = Meff / total_mass * 100
cum += ratio
print(f"Mod {i+1}: T={T3[i]:.4f}s, Meff={Meff:7.1f}kg, "
f"katilim=%{ratio:5.2f}, kumulatif=%{cum:6.2f}")
print(f"\nKONTROL - kumulatif tam %100 olmali: {abs(cum-100) < 1e-9}")
--- 2 katli bina ---
Mod 1: w=39.088 rad/s, T=0.1607 s, sekil=[1.000, 1.618]
Mod 2: w=102.333 rad/s, T=0.0614 s, sekil=[1.000, -0.618]
Analitik: w1=39.088, w2=102.333 -> eslesme: True
--- 3 katli bina: modal kutle katilimi ---
Mod 1: T=0.2232s, Meff= 2742.2kg, katilim=%91.41, kumulatif=% 91.41
Mod 2: T=0.0797s, Meff= 224.6kg, katilim=% 7.49, kumulatif=% 98.90
Mod 3: T=0.0551s, Meff= 33.1kg, katilim=% 1.10, kumulatif=%100.00
KONTROL - kumulatif tam %100 olmali: True
✓ Bu platform tarafından gerçekten çalıştırıldı — analitik kapalı-form ile eşleşti
MATLAB modal_analysis.m
m = 1000.0; % kg, her kat
k = 4.0e6; % N/m, her kat
% --- 2 katli kayma binasi ---
M = [m 0; 0 m];
K = [2*k -k; -k k];
% MATLAB'in genellestirilmis ozdeger cozucusu: eig(K, M)
% (Python'da inv(M)*K kullandik; MATLAB'da eig(K,M) daha kararlidir)
[evecs, evals] = eig(K, M);
[lambda_sorted, idx] = sort(diag(evals));
evecs = evecs(:, idx);
w = sqrt(lambda_sorted);
T = 2*pi ./ w;
fprintf('--- 2 katli bina ---\n');
for i = 1:2
phi = evecs(:, i) / evecs(1, i); % 1. kat = 1 normalize
fprintf('Mod %d: w=%.3f rad/s, T=%.4f s, sekil=[%.3f, %.3f]\n', ...
i, w(i), T(i), phi(1), phi(2));
end
w1_exact = sqrt(k/m * (3-sqrt(5))/2);
w2_exact = sqrt(k/m * (3+sqrt(5))/2);
fprintf('Analitik: w1=%.3f, w2=%.3f\n', w1_exact, w2_exact);
% --- 3 katli bina: modal kutle katilimi ---
M3 = diag([m m m]);
K3 = [2*k -k 0;
-k 2*k -k;
0 -k k];
[evecs3, evals3] = eig(K3, M3);
[lambda3, idx3] = sort(diag(evals3));
evecs3 = evecs3(:, idx3);
w3 = sqrt(lambda3);
T3 = 2*pi ./ w3;
r = ones(3,1);
total_mass = r' * M3 * r;
fprintf('\n--- 3 katli bina: modal kutle katilimi ---\n');
cum = 0;
for i = 1:3
phi = evecs3(:, i);
Mn = phi' * M3 * phi;
Ln = phi' * M3 * r;
Meff = Ln^2 / Mn;
ratio = Meff / total_mass * 100;
cum = cum + ratio;
fprintf('Mod %d: T=%.4fs, Meff=%7.1fkg, katilim=%%%5.2f, kumulatif=%%%6.2f\n', ...
i, T3(i), Meff, ratio, cum);
end
fprintf('\nKONTROL - kumulatif tam %%100 olmali: %d\n', abs(cum-100) < 1e-9);
--- 2 katli bina ---
Mod 1: w=39.088 rad/s, T=0.1607 s, sekil=[1.000, 1.618]
Mod 2: w=102.333 rad/s, T=0.0614 s, sekil=[1.000, -0.618]
Analitik: w1=39.088, w2=102.333
--- 3 katli bina: modal kutle katilimi ---
Mod 1: T=0.2232s, Meff= 2742.2kg, katilim=%91.41, kumulatif=% 91.41
Mod 2: T=0.0797s, Meff= 224.6kg, katilim=% 7.49, kumulatif=% 98.90
Mod 3: T=0.0551s, Meff= 33.1kg, katilim=% 1.10, kumulatif=%100.00
KONTROL - kumulatif tam %100 olmali: 1
⚠ Bu kod gerçek bir MATLAB'da çalıştırılmadı. Dikkat edilen fark: Python'da inv(M)·K kullanıldı; MATLAB'da eig(K,M) genelleştirilmiş biçimi tercih edildi — sayısal olarak daha kararlıdır ve büyük sistemlerde matris tersi almaktan kaçınır. İkisi de aynı özdeğerleri verir. Kendi MATLAB'ınızda çalıştırıp doğrulayın.