R で書いたガウスの消去法
#
# ガウスの消去法
# ...modified on 2015.05.18 (04:02)
#
# この中身を I:¥rdata¥gauss.r に保存した上で、
# source('I:/rdata/gauss.r')
# m <- gauss(matrix(c(1,2,3,2,3,4,3,4,6,2,4,5),3,4))
# cat(m) のようにして使います
#
N <- 3
abs <- function(f) {ifelse(f<0,-f,f)}
gauss <- function(a) {
# 前処理: 行を大きい順に並び替える
for (i in 1:N) {
max <- 0
pvt <- i
for (j in i:N) {
if (abs(a[j,i]) > max) {
max <- abs(a[j,i])
pvt <- j
}
}
if (pvt != i) {
for (j in 1:(N+1)) {
tmp <- a[i,j]
a[i,j] <- a[pvt,j]
a[pvt,j] <- tmp
}
}
}
# 本処理
for (i in 1:N) {
p <- a[i,i] # 対角要素を保存して
a[i,i] <- 1 # 対角要素を1にする
for (j in (i+1):(N+1)) {
a[i,j] <- a[i,j]/p
}
for (j in (i+1):N) {
if (j>N) break
q <- a[j,i]
for (k in (i+1):(N+1)) {
a[j,k] <- a[j,k] - q * a[i,k]
}
a[j,i] <- 0 # zero 要素
}
}
# 解を計算する
x <- array(0,N)
for (i in N:1) {
x[i] = a[i,N+1]
for (j in N:(i+1)) {
if ((i+1)>N) next
x[i] <- x[i] - a[i,j]*x[j]
}
}
return(x)
}
目次へ戻る
前田としゆき / maechan@hannan-u.ac.jp