Осваиваю R. Хочу решить систему из двух нелинейных уравнений с двумя неизвестными.
0.65 / (1 - 0.4^2) - ((1 - (1.4-1) / (1.4+1) * x[1]^2)^(1/(1.4-1)) * ((1.4+1) / 2)^(1/(1.4-1)) * x[1]) * sin(x[2]) = 0
и
(1 / (1.2 * (1 - (1.4-1)/(1.4+1) * x[1]^2))^0.5) * (x[1]^2 + ((360 * (1 + 0.4^2) / 2) / 310)^2 - 2 * x[1] * ((360 * (1 + 0.4^2) / 2) / 310) * cos(x[2]))^0.5 - 0.75 = 0
Вот такой код у меня в R script'е:
library(rootSolve)
M_11.1 <- 0.75
fn.11 <- function(x) {
fn.11a <- 0.65 / (1 - 0.4^2) - ((1 - (1.4-1) / (1.4+1) * x[1]^2)^(1/(1.4-1)) * ((1.4+1) / 2)^(1/(1.4-1)) * x[1]) * sin(x[2])
fn.11b <- (1 / (1.2 * (1 - (1.4-1)/(1.4+1) * x[1]^2))^0.5) * (x[1]^2 + ((360 * (1 + 0.4) / 2) / 310)^2 - 2 * x[1] * ((360 * (1 + 0.4) / 2) / 310) * cos(x[2]))^0.5 - M_11.1
c(fn.11a = fn.11a, fn.11b = fn.11b)
}
(ss <- multiroot(f = fn.11, start = c(0.7, 1.3)))
Это пример из учебника и я задаю точные первые приближения, поэтому получаю корректный результат.
Если изменить его немного для моей задачи — вместо 360 поставить 380, а вместо 0.65 в fn.11a поставить 0.78, то с теми же начальными приближениями я получаю некорректные значения x[1] и x[2].
Вот скорректированный код:
library(rootSolve)
M_11.1 <- 0.75
fn.11 <- function(x) {
fn.11a <- 0.78 / (1 - 0.4^2) - ((1 - (1.4-1) / (1.4+1) * x[1]^2)^(1/(1.4-1)) * ((1.4+1) / 2)^(1/(1.4-1)) * x[1]) * sin(x[2])
fn.11b <- (1 / (1.2 * (1 - (1.4-1)/(1.4+1) * x[1]^2))^0.5) * (x[1]^2 + ((380 * (1 + 0.4) / 2) / 310)^2 - 2 * x[1] * ((380 * (1 + 0.4) / 2) / 310) * cos(x[2]))^0.5 - M_11.1
c(fn.11a = fn.11a, fn.11b = fn.11b)
}
(ss <- multiroot(f = fn.11, start = c(0.7, 1.3)))
Значения x[1] должны лежать между 0 и 1, а x[2] — между 0.873 и 1.571.
Чтобы задать корректные первые приближения, наверно, надо построить график пересечения двух функций, но я не знаю как это сделать.
Перемещено jollheef из general