簡體   English   中英

如何找到多個未知的根

[英]How to find root with more than one unknown

fff5=function(x)x*31*24 * (1/(31*24))*0.30  +  400*31*24 * (1/(31*24))*0.025   +       ( (10 * 31 * 24 - 100*31*24/20 )/(31*24)  * 6 ) - 200

fff5 function 描述了 Amazon Elastic File System 的成本,其中 x 是標准計划中每天 24 小時 31 天的存儲 Gb,400 是 EFS 不頻繁訪問中的存儲 GB,每天 24 小時 31 天,10 是 MB/ s 吞吐量 31 天每天 24 小時,200 是最大預算。

當我做:

uniroot(fff5, lower=0, upper=1, extendInt = "yes",maxiter = 10000)$root 
[1] 533.3333

我發現可以在標准計划中 31 天、每天 24 小時存儲的 GB 的最高值加上不頻繁訪問中的 400gb 成本以及最大預算為 200 的吞吐量中 10mb 的成本:

fff5(533.3333)
>[1] -0.00001
> fff5(533.3334)
[1] 0.00002

如何對其他兩個未知數(y,z)做同樣的事情? 如何找到多個未知的根? 如何找到使該 function 為正的 xyz 值的所有組合。

fff6=function(x,y,z)x*31*24 * (1/(31*24))*0.30  +  y*31*24 * (1/(31*24))*0.025   +       ( (z* 31 * 24 - 100*31*24/20 )/(31*24)  * 6 ) - 200

你提出的方程是類型

ax + by + cz + d = 0

這是一個計划。 這意味着您的解決方案是無限的,並且都是屬於方程定義的平面的所有點。

由於有無限的解決方案,你唯一能做的就是盡可能縮小尋找它們的空間。

您可以選擇一個未知數(例如 x)並將另外兩個視為參數

此時,為 y 和 z 分配合理的值。 不幸的是,我不知道這些變量表示什么,但我假設它們與前一點中的 x 具有相同的數量級(〜 500)

yy <- seq(400, 600, 10)
zz <- seq(400, 600, 10)

必須重新組合這兩個變量才能獲得網格:

df_grid <- expand.grid(y = yy, z = zz)

注意:向量越長,計算量越大。

現在您可以通過 uniroot 找到 x 解決方案(將 y 和 z 作為數字傳遞)並且您的問題的解決方案(在所選范圍內)將是所有三元組 x、y、z

fff6=function(x,y,z) { x*31*24 * (1/(31*24))*0.30  + 
    y*31*24 * (1/(31*24))*0.025   + 
    ( (z* 31 * 24 - 100*31*24/20 )/(31*24)  * 6 ) - 200
}

x_sol <- NULL
for (i in 1:nrow(df_grid)) {
  xs <- uniroot(fff6, c(-10000, 10000), y = df_grid$y[i], z = df_grid$z[i] )$root
  x_sol <- c(x_sol, xs)
}

df_grid$x <- x_sol

注意1 :有更優雅的方法可以避免編寫前面for循環。 例如:

x_sol <- mapply(function(y, z) uniroot(fff6, interval = c(-10000,10000), 
                               y=y, z=z)$root, df_grid$y, df_grid$z))
df_grid$x <- x_sol

注意2 :我選擇的范圍顯示了否定的解決方案(我懷疑這沒有用)。 獲得正解的一個可能選擇是:

yy <- seq(100, 300, 10)
zz <- seq(10, 30, 1)

選擇在合適的范圍內尋找解決方案!


暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM