Есть два способа решения вашей проблемы.
Первый использует nleqslv
для решения системы из 50 уравнений с 50 переменными:
x[1]
до x[49]
и n
. Функция, которую нужно решить с помощью nleqslv
, должна возвращать вектор, содержащий 50 элементов; система уравнений должна быть квадратной.
Вторая упрощает вашу задачу до одного уравнения в n
.
Первое решение:
library(nleqslv)
fn <- function(z,y) {
x <- z[1:49]
n <- z[50]
f <- numeric(50)
for( k in 1:49 ) f[k] <- log(x[k],y[k]) - n
f[50] <- sum(x) - 1
f
}
Сгенерируйте некоторые значения для y и начальные значения для x
и n
и попробуйте решить
y <- rep(2,49)
guess <- c( rep(.5,49), 1)
res <- nleqslv(guess,fn,y=y)
res
Результат проверки:
# this should sum to 1
sum(res$x[1:49])
# value of n
res$x[50]
Второе решение:
Используйте тот факт, что log(a,b) = n
подразумевает a <- b^n
.
Так что log(x[k],y[k])=n
эквивалентно x[k]=y[k]^n
.
Таким образом, x[1:49]
может быть вычислено немедленно. Нам нужно только определить n
из ограничения, что элементы x
составляют 1.
Это подразумевает простую функцию
f2 <- function(n,y) {
x <- y^n # gives values for x
sum(x) - 1
}
А теперь используйте uniroot
, как это при условии, что значения для n
будут лежать между -10 и 10 и что знаки f2
в конечных точках имеют противоположный знак.
uniroot(f2,c(-10,10), y=y)
Вы можете запустить этот код, как указано, и убедиться, что nleqslv
и uniroot
дают одинаковый результат для n
.
Сработает ли это для ваших данных, зависит от вас.