Построение нелинейной функции в R

В настоящее время я пытаюсь построить следующую функцию в 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, но я тоже не могу разобраться в этом.

Было бы полезно узнать значения m, s, R1 и R2. Кажется, в вашем уравнении слишком много скобок, что ухудшает читаемость. Также является ли s нечетным целым числом? (так что действительные корни x^(1/s) существуют)

Martin Brown 14.08.2024 18:36

Привет @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. Я использовал скобки, чтобы избежать проблем... но я открыт для возможных исправлений.

John M. Riveros 14.08.2024 18:40

Я подозреваю, что проблема здесь в неправильной перестановке уравнения для получения формы F2 = f(F1).

Carl Witthoft 14.08.2024 18:52

Спасибо @CarlWitthoft. Я думаю, что аналитическое решение формы F2=f(F1) неправдоподобно из-за неразделимости F2 и F1. Вот почему мне предложили вместо этого использовать числовые методы... но я думаю, что функция имеет два изображения в F2 для каждого F1.

John M. Riveros 14.08.2024 19:02
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы можем решить эту проблему явно, используя 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?

Carl Witthoft 14.08.2024 23:10

Это решение просто идеальное. Я много спрашивал на разных форумах, и этот однозначно оказался лучшим. Я пробовал разные спецификации вместо одного аналитического решения. Никаких хороших результатов я не получил. Придя к выводу, что F1 имеет два изображения на F2, это частично объясняет аномальные результаты, которые я получил. Я действительно ценю это.

John M. Riveros 15.08.2024 00:34

@Carl Witthoft, Ryacas — это более поздняя версия Ryacas0. Проверьте файл Ryacas NEWS.

G. Grothendieck 15.08.2024 02:52

Другие вопросы по теме