функция Matlab, которая является функцией интегрального - PullRequest
2 голосов
/ 12 декабря 2011

Мне нужно написать свою собственную функцию, которая имеет вид f(x,y)=Integrate(g(x,y,z),z from 0 to inf). поэтому код, который я использовал, был:

function y=f(x,y)
g=@(z)exp(-z.^2)./(z.^x).*(z.^2+y.^2).^(x/2);% as a function of x,y and z
y=quadgk(g,0,inf)

и если я вызываю его для единственного значения, например f(x0,y0), оно работает, но если я пытаюсь вычислить что-то вроде f([1:10],y0), то в сообщении об ошибке говорится, что что-то не так с временем и измерением. В принципе я могу использовать для циклов, но тогда мой код замедляется и занимает вечно. Могу я чем-нибудь помочь вам, ребята? или ссылки?

Я пытаюсь избежать цикла for, поскольку в matlab гораздо быстрее использовать матричные вычисления, чем использовать для цикла. Интересно, есть ли какая-нибудь хитрость, чтобы я мог воспользоваться этой функцией?

Спасибо за любую помощь заранее,

Lynn

Ответы [ 3 ]

0 голосов
/ 12 декабря 2011

Если цикл не является для вас проблемой, вы должны сделать что-то вроде:

function y2=f(x,y)
y2=zeros(size(x));

for n=1:numel(x)
  g=@(z)exp(-z.^2)./(z.^x(n)).*(z.^2+y.^2).^(x(n)/2);% as a function of x,y and z
  y2(n)=quadgk(g,0,inf)
end
0 голосов
/ 12 декабря 2011

Проблема здесь в том, что quadk сам использует векторы в качестве аргумента для g. Тогда у вас есть g что-то похожее на z.^x, которое является степенью двух векторов, которая определяется, только если z и x имеют одинаковую размерность. Но это не то, что вы хотите.

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

g=@(x)[x;x.^2]
quad(g,0,1)

не работает:

Error using quad (line 79)
The integrand function must return an output vector of the same length as the
input vector.

Аналогичная ошибка отображается при использовании quadgk. В документации также говорится, что эта процедура работает только для скалярных функций, и это неудивительно, поскольку правило адаптивной квадратуры обычно использует разные точки для каждой функции для оценки интеграла.

Вместо этого вы должны использовать quadv, который может интегрировать векторнозначные функции. Но это дает неверные результаты, поскольку ваша функция интегрирована в интервале [0, \ infty).

0 голосов
/ 12 декабря 2011

Возможно, вы можете попытаться транспонировать интервал, создавая значения на основе строк вместо столбцов f([1:10]',y0). В противном случае что-то в вашей функции может быть неправильным, например, чтобы заставить x^y работать со списками в качестве входных данных, вы должны поставить префикс с точкой x.^y. То же самое для многократного и деления я думаю ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...