2014-02-17 3 views
1

Мне нужно рассчитать интеграцию во многих точках. Так,Как написать функцию, которая включает численное интегрирование?

f = f(r,theta,k,phi); 
q =integral2(f,0,1,0,2*pi,'AbsTol',0,'RelTol',1e-10); % integration should be by k and phi 

Я хочу д быть функцией г и тета, что я могу назвать его в любое время, чтобы вычислить интеграцию в данном г и тета точки. Как я могу это сделать? Проблема заключается в том, что я не мог использовать неопределенные функции @ или matlabFunction(), потому что кажется, что интеграция выполняется в первую очередь, и когда Matlab обнаруживает, что он не имеет всех аргументов, он приносит некоторые ошибки.

+0

«... это приносит некоторые ошибки». - Было бы полезно, если бы вы были конкретны. Ваш код недействителен, если функция 'f' не возвращает дескриптор функции. Несмотря на это, это плохая идея переопределить 'f'. – horchler

+0

Да, f - это ручка. Интеграция принимает дескриптор функции, который является функцией четырех переменных. Ошибки были связаны с аргументом как дескриптор функции. Тогда я не понимаю, как правильно определить функцию, которая будет вычислять интеграцию во многих точках, которые я даю из сетки. Я написал таким образом q = @ (r, theta) integ2 (f, 0,2 * pi, 0,10, 'AbsTol', 0.01, 'RelTol', 1е-10), но я не уверен, что это работает ОК. это как-то уродливое решение, я думаю. – bordart

ответ

2

это все, что вы ищете (я до сих пор не знаю, что f возвращается) ?:

r = ...  % Define 
theta = ... % Define 
g = @(k,phi)f(r,theta,k,phi); % g is now a function of k and phi 
q = integral2(g,0,1,0,2*pi,'AbsTol',0,'RelTol',1e-10); 

Это создает анонимную функцию g где значение r и theta захватываются в качестве параметров и k и theta все еще являются аргументами. Эта концепция известна как closure в области информатики.

Если вы хотите, чтобы превратить все это в зависимости от r и theta, которая возвращает q вы можете можете создать следующую анонимную функцию:

q = @(r,theta)integral2(@(k,phi)f(r,theta,k,phi),0,1,0,2*pi,'AbsTol',0,'RelTol',1e-10); 

, что вы можете позвонить с q(r,theta). Конечно, вы могли бы использовать обычные функции (которые, как правило, быстрее и делают ваш код более понятным для других).

+0

f - функция f = @ (r, theta, k, phi) g (r, theta, k, phi), где g - выражение. Итак, как назвать q (r, тета) в какой-то момент? – bordart

+0

ОК. Спасибо. Этот вопрос не связан с тем, который обсуждался в этом обсуждении, но если я столкнулся с «Предупреждение: Достигнуто максимальное количество оценок функций (10000). Результатом является ошибка глобального теста ошибок ». Эта ошибка, есть ли какая-либо страница, на которой эта проблема обсуждается? – bordart

+0

@artalexan: попробуйте раздел [Советы] (http://www.mathworks.com/help/matlab/ref/integral2.html#btdesxy-4) в документации. Возможно, вам придется играть с допуском. Я также рекомендую эту самую недавнюю [запись в блоге из MathWorks] (http://blogs.mathworks.com/loren/2014/02/12/double-integration-in-matlab-methods-and-handling-discontinuities-singularities- и-больше /), чтобы узнать больше о двойной интеграции. – horchler

Смежные вопросы