如何仅在Scilab中的一个变量中评估函数

时间:2018-04-24 22:09:37

标签: scilab

如何仅在其中一个变量中评估函数,也就是说,我希望在评估函数后获得另一个函数。我有以下代码。

deff ('[F] = fun (x, y)', 'F = x ^ 2-3 * y ^ 2 + x * y ^ 3');
fun (4, y)

我希望得到16-3y ^ 2 + 4y ^ 3

2 个答案:

答案 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()和其他人使用了此内容:

  1. 创建一个包含该功能的list和部分评估的参数:list(f,arg1,arg2,...,argn)
  2. 使用另一个函数来评估此类列表和最后一个参数:evalPartList(list(...),last_arg)
  3. 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是数字软件,因此无法做到这一点。但是有一个工具箱scimaxinstallation guide)依赖于免费的正式软件wxmaxima。

BUT

一个丑陋,愚蠢但仍然有效的解决方案是利用字符串:

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)