Как оценить функцию только по одной из ее переменных в Scilab - PullRequest
0 голосов
/ 25 апреля 2018

Как оценить функцию только по одной из ее переменных, то есть я надеюсь получить другую функцию после оценки функции. У меня есть следующий кусок кода.

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

Я надеюсь получить 16-3y ^ 2 + 4y ^ 3

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Если вы хотите написать x = f(4,y), а позже просто наберите x(2), чтобы получить -36, что называется частичное применение :

Интуитивно понятно, что приложение с частичной функцией говорит: «Если вы исправите первые аргументы функции, вы получите функцию из оставшихся аргументов».

Это очень полезная функция, иочень распространенные языки функционального программирования, такие как Haskell, но даже JS и Python теперь могут это сделать.Это также возможно сделать в MATLAB и GNU / Octave, используя анонимные функции ( см. Этот ответ ).В Scilab, однако, эта функция недоступна .

Workround

Тем не менее, сам Scilab использует обходные пути для переноса функции со своими аргументамибез полной оценки.Вы видите, что это используется в ode(), fsolve(), optim() и других:

  1. Создайте list, содержащий функцию и аргументы для частичной оценки: list(f,arg1,arg2,...,argn)
  2. Используйте другую функцию для оценки такого списка и последнего аргумента: 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

Youможете проверить это на консоли 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(), и вы должны быть осторожны, чтобы не превысить или не сократить количество аргументов.

0 голосов
/ 25 апреля 2018

Как вы просите, вы не можете.

То, что вы ищете, называется символической (или формальной) вычислительной математикой, потому что вы не передаете действительные числовые значения функциям.

Scilab - это числовое программное обеспечение, поэтому оно не может делать такие вещи. Но есть набор инструментов scimax ( руководство по установке ), который опирается на бесплатное формальное программное обеспечение 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) 
...