我应该删除这个问题,因为我在stackoverflow上的其他地方找到了答案。
使用'Vectorize'解决了这个问题。
outer(x,y,Vectorize(model))
如果这有助于其他任何人,我会留下一点。我遇到的问题如下所述。
我是R的偶尔用户,主要用于科学编程。我想评估x,y值网格上的函数。类似这个简单例子的东西:
> x=seq(1,5,1)
> y=seq(1,5,1)
> model = function(a,b){a+b}
> (outer(x,y,model))
[,1] [,2] [,3] [,4] [,5]
[1,] 2 3 4 5 6
[2,] 3 4 5 6 7
[3,] 4 5 6 7 8
[4,] 5 6 7 8 9
[5,] 6 7 8 9 10
我的实际功能的输入和输出如下所示(圆形管道中“交叉”流体的体积流量):
> SimpleCrossModelCircPipe(eta_0 = 176.45, lambda = 2.4526, m=0.83122, mesh=1000,
pipe_length=1.925, press_drop=20.3609, pipe_diameter=0.0413)
[1] 0.005635064
我想评估值网格上的函数,例如press_drop和pipe_diameter。因此,定义这两个变量的函数。
> model = function(a,b){SimpleCrossModelCircPipe(eta_0 = 176.45, lambda = 2.4526,
m=0.83122, mesh=1000,pipe_length=1.925, press_drop=a, pipe_diameter=b)}
对于一对值,这确实有效:
> model(1,2)
[1] 107249.8
但是,如果我使用'outer',则会出错。
> (outer(x,y,model))
seq.default中的错误(tau_wall,0,length.out = mesh + 1): 'from'必须长度为1
如果我为局部变量tau_wall放置一个print语句,则使用outer生成所有25个值,然后移动到生成错误的行,因为tau_wall的长度应为1,而不是25。
(outer(x,y,model))
[1] 352.5289 705.0579 1057.5868 1410.1158 1762.6447 705.0579 1410.1158 2115.1736
[9] 2820.2315 3525.2894 1057.5868 2115.1736 3172.7605 4230.3473 5287.9341 1410.1158
[17] 2820.2315 4230.3473 5640.4630 7050.5788 1762.6447 3525.2894 5287.9341 7050.5788
[25] 8813.2235
是否有一个简单的解决方法可以使这项工作?
最佳,
史蒂夫