[英]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.