Создание дескрипторов массива для функции, которая возвращает вектор полиномиальных выражений

Я пытаюсь использовать функцию численного интегрирования "интеграл"

Я создал функцию из четырех полиномиальных функций

[x; x^2; x^3; x^4]

Теперь я хочу интегрировать этот вектор строка за строкой, используя интегральную функцию. Я попытался создать дескриптор функции для функции и передал ее в "встроенную" функцию

function f = test(x)
    f = [x,x^2,x^3,x^4];
end

Однако при вызове командной строки я получаю следующую ошибку:

test_var=@test
integral(test_var,0,1)
Error using  ^ 
One argument must be a square matrix and the other must be a scalar. 
Use POWER (.^) for elementwise power.

Error in test (line 2)
    f = [x,x^2,x^3,x^4];

Error in integralCalc/iterateScalarValued (line 314)
            fx = FUN(t);

Error in integralCalc/vadapt (line 132)
        [q,errbnd] = iterateScalarValued(u,tinterval,pathlen);

Error in integralCalc (line 75)
    [q,errbnd] = vadapt(@AtoBInvTransform,interval);

Error in integral (line 88)
Q = integralCalc(fun,a,b,opstruct);

1 ответ

Согласно документацииintegral:

q = integral(fun, xmin, xmax)

  1. Для скалярной функции fun вам нужно определить функцию так, чтобы она принимала векторный ввод и производила векторный вывод.

    Для скалярных задач функция y = fun(x) должен принять векторный аргумент, xи вернуть векторный результат, y, Обычно это означает, что fun должен использовать операторы массива вместо матричных операторов. Например, используйте .* (times) скорее, чем * (mtimes).

  2. Если у вас есть вектор-функция fun вам нужно использовать флаг ввода 'ArrayValued':

    Установите этот флаг на true указать, что fun является функцией, которая принимает скалярные входные данные и возвращает выходные данные вектора, матрицы или ND-массива.

    и в этом случае требование в пункте 1 выше не является необходимым:

    Если вы установите 'ArrayValued' вариант к истине, то fun должен принять скаляр и вернуть массив фиксированного размера.


Итак, вам нужно добавить флаг ввода'ArrayValued' чтобы указать, что у вас есть вектор-функция:

f = @(x) [x; x^2; x^3; x^4]; % or [x; x.^2; x.^3; x.^4];
integral(f, 0, 1, 'ArrayValued', true) % or integral(@f, 0, 1, 'ArrayValued', true)
                                       % if f is defined in a file

дает

ans =
   0.500000000000000
   0.333333333333333
   0.250000000000000
   0.200000000000000
Другие вопросы по тегам