小结
我有一个表示拓Flutter 面的值矩阵.我正在计算每列y的精确等高线z的x值.
在深度上
我正在将实验数据与三维非线性衰减模型z(x,y)进行拟合. 我的分析的任何代码都需要适合许多不同的数据集.我已经成功地将模型参数化,并在给定x和y的每个整数值的情况下计算z.然后,我需要提取特定等高线的值. 每个变量的范围是x:(0>;x>;80);y:(0>;y>;100);z:(0&>;z>;1).
require(pracma)
# Truncated matrix with demo data, normally created by fitting parameterized algorithm to 81x100 matrix
M <- matrix(c(0,1,1,1,1,1,1,1,1,
0,0.843,1,1,1,1,1,1,1,
0,0.484,0.907,1,1,1,1,1,1,
0,0.218,0.459,0.721,0.978,1,1,1,1,
0,0.082,0.185,0.313,0.461,0.621,0.781,0.925,1,
0,0.029,0.066,0.113,0.171,0.242,0.323,0.414,0.511,
0,0.010,0.022,0.038,0.058,0.082,0.112,0.146,0.186,
0,0.003,0.008,0.013,0.020,0.028,0.037,0.049,0.062,
0,0.001,0.003,0.004,0.007,0.009,0.012,0.016,0.021,
0,0.000,0.001,0.001,0.002,0.003,0.004,0.006,0.007,
0,0.000,0.000,0.001,0.001,0.001,0.001,0.002,0.002),ncol = 11)
# Extract Contours ----
X <- seq(from = 0, to = 80, by = 10) # normally by = 1 on full dataset
Y <- seq(from = 0, to = 100, by = 10)
z <- 0.8
FindZ <- function(x) interp2(X, Y, M, x, y)-z
x_out <- matrix()
for(i in 1:11){
y <- i*10 # adjusted for truncated dataset. Normally in increments of 1
x <- fzero(FindZ, mean(X))
x_out[i] <- x$x
print(x$x)
next}
我得到以下错误:
IF(FB==0)RETURN(LIST(x=b,Fval=FB))出错: 需要TRUE/FALSE的位置缺少值
我意识到并非所有行y
包含的值都会超过我在任何给定时间寻找的z
等值线.为了避免这种情况,我try 在较大的数据集上使用tryCatch()
.当我这样做时,我什么也得不到,比如说,循环迭代y[20]
,它成功地运行了大约15次迭代,然后我得到了相同的余额错误.问题是,我一直在有>;z值的行上得到这个结果,而内插出现了错误.我还交换了代码,并寻求值为x
和z
的解y
,得到了几乎完全相同的结果.
我不想将数据子集,因为我不想丢失绝对的x,y位置,因为它们与物理测量相对应.如果没有z
值,我希望使用replace()
为列放置一个0
.
理想情况下,我想要一个值为(x,y)
的矩阵,如果我反馈给原始函数,它们会计算到我的值z
.任何指点都是很棒的.