2014-02-17 39 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 

我想要的Q的R和theta的一個功能,我可以隨時把它計算在給定的R和θ點的整合。我怎樣才能做到這一點? 問題是我無法使用無限的@函數或matlabFunction()方法,因爲它似乎是先完成了積分,當Matlab檢測到它沒有定義所有參數時,它會帶來一些錯誤。

+0

「......它帶來了一些錯誤。」 - 如果你是特定的,這會很有幫助。你的代碼是無效的,除非函數'f'返回一個函數句柄。無論如何,重新定義'f'是一個壞主意。 – horchler

+0

是的,f是手柄。積分採用了四個變量函數的函數句柄。錯誤與參數是函數句柄有關。然後我不明白什麼是定義一個函數的正確方法,它將計算我在網格中給出的許多點的積分。我用這種方式寫出q = @(r,theta)integral2(f,0,2 * pi,0,10,'AbsTol',0.01,'RelTol',1e-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其中rtheta值被捕捉爲參數, ktheta仍然是論據。這個概念在計算機科學中被稱爲closure

如果你想關閉整個事情成rtheta返回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,theta)? – 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