在 R 中绘制非线性函数

问题描述 投票:0回答:1

我目前正在努力绘制 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 也是固定的。

由于该函数是非线性的,因此建议我使用数值近似来在先前定义的 F1 域中查找 F2 的值。

我开发了下一个代码,首先定义常量,然后是函数,以及求根函数:

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)附图中已明确定义。

enter image description here

因此,我想请求帮助如何绘制图(并恢复 F1 域的每个部分的 F2 值)。

数学方程式如下:

enter image description here

PD:我认为 F2 对于每个 F1 有两个结果,但我也无法解决这个问题。

r function plot numerical-methods non-linear
1个回答
0
投票

我们可以使用 Ryacas0 明确地解决这个问题。 注意有两个根 如果 F1 > 50,则

sqrt
的参数为负,因此使用 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))
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))

screenshot

© www.soinside.com 2019 - 2024. All rights reserved.