如何仅在其中一个变量中评估函数,也就是说,我希望在评估函数后获得另一个函数。我有以下代码。
deff ('[F] = fun (x, y)', 'F = x ^ 2-3 * y ^ 2 + x * y ^ 3');
fun (4, y)
我希望得到16-3y ^ 2 + 4y ^ 3
答案 0 :(得分:2)
如果您要做的是写x = f(4,y)
,稍后只需x(2)
来获取-36
,那就是 partial application :
直观地,部分函数应用程序说"如果你修复了函数的第一个参数,你得到剩下的参数的函数"。
这是一个非常有用的功能,非常常见的函数式编程语言,例如Haskell,但即便是JS和Python也能够做到这一点。也可以使用匿名函数(see this answer)在MATLAB和GNU / Octave中执行此操作。但是,在Scilab中,此功能不可用。
<强> Workround 强>
尽管如此,Scilab本身使用一种变通方法来携带一个带有参数的函数,而无需进行全面评估。您看到ode()
,fsolve()
,optim()
和其他人使用了此内容:
list
和部分评估的参数:list(f,arg1,arg2,...,argn)
evalPartList(list(...),last_arg)
evalPartList()
的实现可能是这样的:
function y = evalPartList(fList,last_arg)
//fList: list in which the first element is a function
//last_arg: last argument to be applied to the function
func = fList(1); //extract function from the list
y = func(fList(2:$),last_arg); //each element of the list, from second
//to last, becomes an argument
endfunction
您可以在Scilab的控制台上进行测试:
--> deff ('[F] = fun (x, y)', 'F = x ^ 2-3 * y ^ 2 + x * y ^ 3');
--> x = list(fun,4)
x =
x(1)
[F]= x(1)(x,y)
x(2)
4.
--> evalPartList(x,2)
ans =
36.
这是evalPartList()
的一个非常简单的实现,你必须小心不要超过或缩短参数的数量。
答案 1 :(得分:0)
按照你要求的方式,你不能。
你所看到的是象征性(或正式)计算数学,因为你没有将实际数值传递给函数。
Scilab是数字软件,因此无法做到这一点。但是有一个工具箱scimax(installation guide)依赖于免费的正式软件wxmaxima。
一个丑陋,愚蠢但仍然有效的解决方案是利用字符串:
function F = fun (x, y) // Here we define a function that may return a constant or string depending on the input
fmt = '%10.3E'
if (type(x)==type('')) & (type(y)==type(0)) // x is string is
ys = msprintf(fmt,y)
F = x+'^2 - 3*'+ys+'^2 + '+x+'*'+ys+'^3'
end
if (type(y)==type('')) & (type(x)==type(0)) // y is string so is F
xs = msprintf(fmt,x)
F = xs+'^2 - 3*'+y+'^2 + '+xs+'*'+y+'^3'
end
if (type(y)==type('')) & (type(x)==type('')) // x&y are strings so is F
F = x+'^2 - 3*'+y+'^2 + '+x+'*'+y+'^3'
end
if (type(y)==type(0)) & (type(x)==type(0)) // x&y are constant so is F
F = x^2 - 3*y^2 + x*y^3
end
endfunction
// Then we can use this 'symbolic' function
deff('F2 = fun2(y)',' F2 = '+fun(4,'y'))
F2=fun2(2) // does compute fun(4,2)
disp(F2)