Пер с integral2
documentation, переменные пределы приведены в качестве второй пары пределов. Таким образом, ваш первый интеграл должен быть
% Define function to be integrated
f = @(x,y) y.^2.*cos(x);
% First case. Integration order: dydx
ymin = @(x) cos(x);
I = integral2(f,0,2*pi,ymin,1);
Множество постоянных пределов всегда идет первым, и Matlab предполагает, что первый аргумент f
связан с первым набором ограничений, а второй аргумент f
связан с второй набор пределов, который может быть функцией первого аргумента.
я указываю, что вторая часть, потому что, если вы хотите изменить порядок интеграции, также необходимо изменить порядок входов f
соответственно. Рассмотрим следующий пример:
fun = @(x,y) 1./(sqrt(2*x + y) .* (1 + 2*x + y).^2)
миленькое функция, которая не является симметричным в своих аргументов (т.е. fun(x,y) ~= fun(y,x)
). Давайте проинтегрируем это по удлиненному треугольнику в первом квадранте с вершинами в (0,0), (2,0) и (0,1). Затем, интегрируя с dA == dy dx
, мы имеем
>> format('long');
>> ymax = @(x) 1 - x/2;
>> q = integral2(fun,0,2,0,ymax)
q =
0.220241017339352
Прохладный. Теперь давайте интегрироваться с dA == dx dy
:
>> xmax = @(y) 2*(1-y);
>> q = integral2(fun,0,1,0,xmax)
q =
0.241956050772765
К сожалению, это не равно первому расчету! Это потому, что fun
определяется с x
в качестве первого аргумента и y
как вторые, но предыдущий вызов integral2
подразумевает, что y
является первым аргументом fun
, и он имеет постоянные пределы 0
и 1
. Как мы это исправим?Просто определите новую функцию, которая переворачивает аргументы:
>> fun2 = @(y,x) fun(x,y);
>> q = integral2(fun2,0,1,0,xmax)
q =
0.220241017706984
И все в порядке с миром. (Хотя вы можете заметить небольшие различия между двумя правильными ответами из-за допусков ошибок integral2
, которые могут быть скорректированы с помощью опций в документации.)