Обобщенные матрицы (для решения системы линейных уравнений) в R
Мне нужно решить систему линейных уравнений в R - что я смог сделать очень хорошо. Пожалуйста, смотрите код ниже:
A<-matrix(c(1:5,2,1,2:4,3,2,1:3,4:2,1,2,5:1),nrow=5) #Creates a matrix of the coefficients
A #Displays the matrix of coefficients (below)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 2 1 2 3 4
[3,] 3 2 1 2 3
[4,] 4 3 2 1 2
[5,] 5 4 3 2 1
kv<-matrix(c(7,-1,-3,5,17),nrow=5) #Creates a column vector of the known values
kv #Displays the column vector
[,1]
[1,] 7
[2,] -1
[3,] -3
[4,] 5
[5,] 17
solve(A,kv) #Solves the continuous equation
[,1]
[1,] -2
[2,] 3
[3,] 5
[4,] 2
[5,] -4
Проблема в том, что теперь мне нужно обобщить свое решение, и оно может быть использовано в системах уравнений той же структуры, но большего размера - БЕЗ ввода всех значений матрицы A, как я указал выше.
Кто-нибудь может указать мне правильное направление, как я могу сделать матрицу коэффициентов, но таким образом, что программа может быть использована для решения других систем?
Любая помощь будет с благодарностью получена
1 ответ
Если я правильно поняла:
bandmat <- function(n){
require(Matrix)
as.matrix(bandSparse(n,n,-(n-1):(n-1),diag=lapply(c(n:1,2:n),function(i) rep(i,n))))
}
bandmat(4)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 1 2 3
[3,] 3 2 1 2
[4,] 4 3 2 1
Там может быть более удобный способ построить это.
Редактировать: Вот как вы используете это.
#create some vector
set.seed(42)
kv <- sample(-10:10,10)
#[1] 9 8 -5 4 0 -2 1 -9 5 2
#solve equation system
solve(bandmat(length(kv)),kv)
#[1] 0.0 -6.0 11.0 -6.5 1.0 2.5 -6.5 12.0 -8.5 2.0