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}")
