Menyelesaikan Sistem Linear dengan solve()
Cari penyelesaian bagi sistem Ax = b dan kira matriks songsang.
Menyelesaikan Sistem Linear dengan solve() ialah pelajaran R Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran R Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Sistem Linear: Ax = b
Sistem persamaan linear boleh ditulis sebagai Ax = b, dengan A ialah matriks pekali, x ialah vektor yang tidak diketahui dan b ialah sebelah kanan persamaan. Menyelesaikan x secara analitik bermaksud mengira x = A⁻¹b.
# System of equations:
# 2x + y = 5
# x + 3y = 7
# Matrix form: A %*% x = b
A <- matrix(c(2, 1,
1, 3), nrow = 2, byrow = TRUE)
b <- c(5, 7)
# What are A and b?
print(A)
print(b)
cat('We want to find x such that A %*% x = b')solve(A, b): Penyelesaian Langsung
solve(A, b) menyelesaikan Ax = b untuk x. Fungsi ini menggunakan penguraian LU secara dalaman, yang lebih stabil dan cekap dari segi berangka berbanding mengira A⁻¹ secara nyata kemudian mendarabkannya dengan b.
A <- matrix(c(2, 1,
1, 3), nrow = 2, byrow = TRUE)
b <- c(5, 7)
# Solve Ax = b
x <- solve(A, b)
print(x) # x[1] = ?, x[2] = ?
# Verify: A %*% x should equal b
residual <- A %*% x - b
print(residual) # Should be near zero
# Manual check:
# 2*(8/5) + (9/5) = 16/5 + 9/5 = 25/5 = 5 ✓
# 1*(8/5) + 3*(9/5) = 8/5 + 27/5 = 35/5 = 7 ✓solve(A): Matriks Songsang
Memanggil solve(A) dengan hanya satu argumen mengembalikan songsangan A: A⁻¹ sehingga A %*% A⁻¹ = I. Elakkan penggunaan ini untuk menyelesaikan Ax=b — gunakan solve(A,b) secara terus kerana lebih pantas dan stabil.
A <- matrix(c(4, 3,
3, 2), nrow = 2, byrow = TRUE)
# Compute inverse
A_inv <- solve(A)
print(A_inv)
# Verify: A %*% A_inv = I
A %*% A_inv # Should be identity matrix
round(A %*% A_inv, 10)
# Also A_inv %*% A = I
round(A_inv %*% A, 10)
# det(A) != 0 required for invertibility
det(A) # -1 (nonzero, so invertible)Menyemak Penyelesaian Anda
Sentiasa sahkan penyelesaian dengan mengira A %*% x - b. Disebabkan aritmetik titik apung, baki tidak akan betul-betul sifar, tetapi sepatutnya hampir dengan epsilon mesin (~1e-15). Gunakan norm() untuk mendapatkan satu magnitud baki.
A <- matrix(c(3, -1, 2,
1, 4, 0,
-2, 1, 5), nrow = 3, byrow = TRUE)
b <- c(1, 2, 3)
# Solve
x <- solve(A, b)
cat('Solution x:\n'); print(x)
# Residual check
residual <- A %*% x - b
cat('Residual vector:\n'); print(residual)
# Residual norm (should be near 0)
resid_norm <- sqrt(sum(residual^2))
cat('Residual norm:', resid_norm, '\n')
# Expected: something like 2e-16Nombor Keadaan: kappa()
Nombor keadaan bagi A mengukur kepekaan penyelesaian terhadap gangguan dalam b. Nombor keadaan yang besar bermaksud ralat kecil dalam b menyebabkan ralat besar dalam x — sistem itu tidak terkondisi dengan baik.
# Well-conditioned matrix
A_good <- matrix(c(2, 1, 1, 3), nrow = 2, byrow = TRUE)
kappa(A_good) # Small -> good
# Ill-conditioned (nearly singular) matrix
A_bad <- matrix(c(1.000, 1.001,
1.001, 1.002), nrow = 2, byrow = TRUE)
kappa(A_bad) # Very large -> bad!
# Rule of thumb: kappa > 1/machine_epsilon is trouble
.Machine$double.eps # ~2.2e-16
# For A_bad: you lose about log10(kappa) digits of precision
cat('Digits lost:', log10(kappa(A_bad)), '\n')backsolve() untuk Segi Tiga Atas
backsolve(R, b) menyelesaikan Rx = b apabila R berbentuk segi tiga atas menggunakan penggantian ke belakang. Jauh lebih pantas daripada solve() umum untuk sistem segi tiga — O(n²) berbanding O(n³).
# Upper triangular system: Rx = b
# 2x + 3y + z = 14
# 5y + 2z = 13
# 4z = 8
R <- matrix(c(2, 3, 1,
0, 5, 2,
0, 0, 4), nrow = 3, byrow = TRUE)
b <- c(14, 13, 8)
# Solve using back-substitution
x <- backsolve(R, b)
print(x) # z=2, y=(13-4)/5=9/5, x=(14-3*9/5-2)/2
# Verify
all.equal(as.vector(R %*% x), b) # TRUE
# Compare with general solve
x_general <- solve(R, b)
all.equal(x, x_general) # TRUE (same result)forwardsolve() untuk Segi Tiga Bawah
forwardsolve(L, b) menyelesaikan Lx = b apabila L berbentuk segi tiga bawah menggunakan penggantian ke hadapan. Fungsi ini melengkapi backsolve() dan kedua-duanya membentuk asas penyelesai penguraian LU.
# Lower triangular system: Lx = b
# 3x = 6
# 2x + 4y = 10
# x + 2y + 5z = 16
L <- matrix(c(3, 0, 0,
2, 4, 0,
1, 2, 5), nrow = 3, byrow = TRUE)
b <- c(6, 10, 16)
# Solve using forward-substitution
x <- forwardsolve(L, b)
print(x) # x=2, y=(10-4)/4=1.5, z=(16-2-3)/5=2.2
# Verify
all.equal(as.vector(L %*% x), b) # TRUE
# Use case: solving L*U*x = b
# forwardsolve(L, b) -> y, then backsolve(U, y) -> xPelbagai Sebelah Kanan
solve(A, B) apabila B ialah matriks menyelesaikan AX = B serentak untuk semua lajur B. Ini lebih cekap daripada memanggil solve(A, b) secara berasingan bagi setiap lajur.
A <- matrix(c(2, 1,
1, 3), nrow = 2, byrow = TRUE)
# Solve for two right-hand sides simultaneously
B <- matrix(c(5, 7, # first system
3, 1), # second system
nrow = 2, byrow = TRUE)
# X[:,1] solves Ax = B[:,1]
# X[:,2] solves Ax = B[:,2]
X <- solve(A, B)
print(X)
# Verify both solutions
A %*% X # Should equal B
all.equal(A %*% X, B) # TRUEMengesan Matriks Singular
Memanggil solve(A) pada matriks singular menghasilkan ralat. Semak det(A) atau rcond(A) (saling balikan nombor keadaan) sebelum membuat penyelesaian. Gunakan tryCatch() untuk kod yang teguh.
# Singular matrix (rows are linearly dependent)
S <- matrix(c(1, 2,
2, 4), nrow = 2, byrow = TRUE)
det(S) # 0 -> singular
kappa(S) # Inf
# Safe solve with tryCatch
safe_solve <- function(A, b) {
tryCatch(
solve(A, b),
error = function(e) {
cat('Matrix is singular or nearly so:\n')
cat(e$message, '\n')
return(NULL)
}
)
}
result <- safe_solve(S, c(1, 2))
print(result) # NULLKuasa Dua Terkecil dengan solve()
Bagi sistem terlebih tentu (lebih banyak persamaan daripada pemboleh ubah tidak diketahui), tiada penyelesaian tepat. Penyelesaian kuasa dua terkecil meminimumkan ||Ax - b||². Ia menyelesaikan persamaan normal: A'Ax = A'b.
# Overdetermined: 4 equations, 2 unknowns (y = a + b*x)
set.seed(1)
x_vals <- c(1, 2, 3, 4)
y_vals <- c(2.1, 4.0, 5.9, 8.2) # approx y = 0 + 2x
A <- cbind(1, x_vals) # Design matrix (4x2)
b <- y_vals
# Normal equations: (A'A) beta = A'b
AtA <- crossprod(A)
Atb <- crossprod(A, b)
beta_ols <- solve(AtA, Atb)
print(beta_ols) # Intercept ~0.1, slope ~2.0
# Residual sum of squares
y_hat <- A %*% beta_ols
rss <- sum((b - y_hat)^2)
cat('RSS:', rss)Menggunakan qr.solve() untuk Kestabilan
qr.solve(A, b) lebih stabil dari segi berangka berbanding solve() untuk sistem yang tidak terkondisi dengan baik atau terlebih tentu. Ia menggunakan penguraian QR dan bukannya LU. lm() menggunakan kaedah ini secara dalaman.
# For overdetermined system, qr.solve is preferred
x_vals <- c(1, 2, 3, 4, 5)
y_vals <- c(1.9, 4.1, 6.0, 7.8, 10.1)
A <- cbind(1, x_vals)
b <- y_vals
# qr.solve handles overdetermined systems directly
beta_qr <- qr.solve(A, b)
print(beta_qr) # intercept, slope
# Equivalent to:
beta_lm <- coef(lm(y_vals ~ x_vals))
all.equal(beta_qr, beta_lm, check.names = FALSE) # TRUE
# For well-determined square systems, solve() is fine
# For overdetermined or ill-conditioned: use qr.solve()Semakan Pantas
Uji pemahaman anda tentang penyelesaian sistem linear dalam R.
Imbas Kembali: Menyelesaikan Sistem Linear
Perkara utama: solve(A, b) menyelesaikan Ax=b secara terus (kaedah pilihan). solve(A) mengira A⁻¹ (elakkan untuk penyelesaian). backsolve(R,b) dan forwardsolve(L,b) pantas untuk sistem segi tiga. kappa(A) mengukur pengkondisian — nilai yang besar bermaksud penyelesaian tidak stabil. Untuk sistem terlebih tentu, gunakan qr.solve(). Sentiasa sahkan dengan A %*% x - b.
# Summary of solve() functions:
A <- matrix(c(3, 1, 1, 2), nrow = 2)
b <- c(9, 8)
# Solve Ax = b
x <- solve(A, b)
print(x) # c(2, 3)
# Check conditioning
kappa(A) # Small -> well-conditioned
# Verify
max(abs(A %*% x - b)) # Near zero
# For triangular systems:
R <- matrix(c(2, 3, 0, 4), nrow = 2, byrow = TRUE)
backsolve(R, c(8, 4)) # x=c(1, 1)
# For least squares (overdetermined):
# qr.solve(design_matrix, y)Pelajari R dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 43
- Pelajaran
- 159
Soalan Lazim
Adakah pelajaran “Menyelesaikan Sistem Linear dengan solve()” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran R Academy, termasuk “Menyelesaikan Sistem Linear dengan solve()”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus R Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Menyelesaikan Sistem Linear dengan solve()”?
Cari penyelesaian bagi sistem Ax = b dan kira matriks songsang. Anda berlatih R Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan R Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran R Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Menyelesaikan Sistem Linear dengan solve()” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran R Academy ini?
Ya. Setiap pelajaran R Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pendaraban Matriks dan Penentu
- Menyelesaikan Sistem Linear dengan solve()
- Nilai Eigen dan Vektor Eigen
- Penguraian SVD, QR dan Cholesky