В настоящее время я пытаюсь построить следующую функцию в R.
(F1/F2^m * (R1 - F1)^((1 - s)/s)) - (m * (((R1 - F1))^(1/s) + ((R2 - F2))^ (1/с)) / (F1^m + F2^m)) = 0
Где я хочу построить график F2 как функцию F1. То есть F2 по оси Y и F1 по оси X. Значения R1,R2 являются фиксированными константами, а s,m также фиксированы.
Поскольку функция нелинейна, мне предложили использовать числовую аппроксимацию, чтобы найти значения F2 в ранее определенной области F1.
Я разработал следующий код, определяющий сначала константы, затем функцию и функцию поиска корня следующим образом:
rm(list=ls())
library(ggplot2)
R1_values <- c(100) # Example values for R1
R2_values <- c(100) # Example values for R2
s_values <- c(1) # Example values for s
m_values <- c(1) # Example values for m
# Define the original function to solve for F2
F2_function <- function(F1, F2, R1, R2, s, m) {
(F1 / F2^m * (R1 - F1)^((1 - s) / s)) - (m * (((R1 - F1))^(1 / s) + ((R2 - F2))^(1 / s)) / (F1^m + F2^m))
}
F1_values <- seq(0.01, 100, by = 0.1)
# Solve for F2
F2_values <- sapply(F1_values, function(F1) {
tryCatch({
#
uniroot(F2_function, c(0.01, 100), F1 = F1, R1 = R1, R2 = R2, s = s, m = m, tol = 1e-8)$root
}, error = function(e) NA)
})
data <- data.frame(F1 = F1_values, F2 = F2_values)
ggplot(data, aes(x = F1, y = F2)) +
geom_line() +
labs(title = "F2 as a Function of F1",
x = "F1",
y = "F2") +
theme_minimal()
Однако все возвращает NA или чрезвычайно большие значения (случайно зная, когда и как). Даже если функция четко определена в другом программном обеспечении (Geogebra), изображение прилагается.
Следовательно, я хотел бы попросить помощи в том, как построить график (и восстановить значения F2 для каждой части области F1).
Уравнение в математическом плане выглядит так:
П.Д.: Я думаю, что у F2 есть два результата на каждую F1, но я тоже не могу разобраться в этом.
Привет @MartinBrown, я устанавливаю m=1, s=1 и R1= 100 вместе с R2=100. Я включил их в код как R1_values <- c(100) , R2_values <- c(100) . s_values <- c(1), m_values <- c(1). поэтому m=s=1 и R1=R2=100. Я использовал скобки, чтобы избежать проблем... но я открыт для возможных исправлений.
Я подозреваю, что проблема здесь в неправильной перестановке уравнения для получения формы F2 = f(F1)
.
Спасибо @CarlWitthoft. Я думаю, что аналитическое решение формы F2=f(F1) неправдоподобно из-за неразделимости F2 и F1. Вот почему мне предложили вместо этого использовать числовые методы... но я думаю, что функция имеет два изображения в F2 для каждого F1.
Мы можем решить эту проблему явно, используя Ryacas0. Обратите внимание, что имеется два корня
и что аргумент sqrt
отрицателен, если F1 > 50, поэтому используя 50 в качестве
верхняя граница вместо 100 и построение двух корней (положительный корень черный)
у нас есть:
library(Ryacas0)
m <- s <- 1
R1 <- R2 <- 100
F1 <- Sym("F1")
F2 <- Sym("F2")
z <- (F1 / F2^m * (R1 - F1)^((1 - s) / s)) -
(m * (((R1 - F1))^(1 / s) + ((R2 - F2))^(1 / s)) / (F1^m + F2^m))
zs <- Simplify(z)
F2solve <- Solve(zs, F2)
F2solve
## Yacas vector:
## [1] F2 == (200 - 2 * F1 + sqrt((2 * F1 - 200)^2 - 4 * F1^2))/2
## [2] F2 == (200 - 2 * F1 - sqrt((2 * F1 - 200)^2 - 4 * F1^2))/2
f1 <- seq(0.1, 50, .1)
f2p <- (200 - 2 * f1 + sqrt((2 * f1 - 200)^2 - 4 * f1^2))/2
f2m <- (200 - 2 * f1 - sqrt((2 * f1 - 200)^2 - 4 * f1^2))/2
matplot(f1, cbind(f2p, f2m))
@Gabor G: есть ли README или что-то подобное, объясняющее разницу между пакетами Ryacas0
и Ryacas
?
Это решение просто идеальное. Я много спрашивал на разных форумах, и этот однозначно оказался лучшим. Я пробовал разные спецификации вместо одного аналитического решения. Никаких хороших результатов я не получил. Придя к выводу, что F1 имеет два изображения на F2, это частично объясняет аномальные результаты, которые я получил. Я действительно ценю это.
@Carl Witthoft, Ryacas — это более поздняя версия Ryacas0. Проверьте файл Ryacas NEWS.
Было бы полезно узнать значения m, s, R1 и R2. Кажется, в вашем уравнении слишком много скобок, что ухудшает читаемость. Также является ли s нечетным целым числом? (так что действительные корни x^(1/s) существуют)