2013-05-15 74 views
5

我們有一個類似於第二類Fredholm integral equation的方程。在Matlab中實現積分方程的迭代求解

enter image description here

爲了解決這個方程,我們已經考慮到保證收斂爲我們的具體方程迭代求解。現在我們唯一的問題就是在MATLAB中實現這個迭代程序。

現在,我們的代碼有問題的部分看起來像這樣:

function delta = delta(x,a,P,H,E,c,c0,w) 

delt = @(x)delta_a(x,a,P,H,E,c0,w); 

for i=1:500 
    delt = @(x)delt(x) - 1/E.*integral(@(xi)((c(1)-c(2)*delt(xi))*ms(xi,x,a,P,H,w)),0,a-0.001); 
end 
delta=delt; 

end 

delta_ax功能,並代表迭代的初始值。 msxxi的函數。

正如您所看到的,我們希望delt依賴於迭代中的x(積分之前)和xi(積分內部)。不幸的是,這種編寫代碼的方式(帶有函數句柄)並不能爲我們提供數值,正如我們所希望的那樣。由於xi沒有定義(直到integral定義它),我們不能寫delt作爲兩個不同的函數,x之一和xi之一。那麼,我們如何才能確保delt依賴於xi內部的積分,並仍然從迭代中獲得數值?

對於我們如何解決這個問題,你們有沒有任何建議?

使用數值積分的輸入參數的

說明:x是數值的矢量,其餘全部是常數。我的代碼有一個問題,輸入參數x沒有被使用(我想這意味着x被視爲符號)。

+1

你使用符號還是數值積分? – Jan

+0

@Jan數值積分。 (編輯我的問題) – Linda

+0

也許'x'是你的函數被近似的網格點的向量....? – Jan

回答

0

看起來你可以在MATLAB做的匿名函數嵌套:

f = 

    @(x)2*x 

>> ff = @(x) f(f(x)) 

ff = 

    @(x)f(f(x)) 

>> ff(2) 

ans = 

    8 

>> f = ff; 


>> f(2) 

ans = 

    8 

此外,它可以將指針重新綁定到的功能。

因此,你可以設置你的迭代像

delta_old = @(x) delta_a(x) 
for i=1:500 
    delta_new = @(x) delta_old(x) - integral(@(xi),delta_old(xi)) 
    delta_old = delta_new 
end 

加上列入您的參數...

+0

謝謝你的回答!我的代碼和你的問題是函數輸入參數x沒有被使用。 x是一個向量,它必須在迭代中使用。 – Linda

0

你可能要考慮爲您解決問題的離散版本。

K是離散你的Fredholm內核k(t,s)的矩陣,例如,

K(i,j) = int_a^b K(x_i, s) l_j(s) ds 

其中l_j(s)是,例如,第j個lagrange interpolant相關聯的內插節點(x_i) = x_1,x_2,...,x_n

然後,解決您皮卡德迭代是因爲這樣做簡單

phi_n+1 = f + K*phi_n 

for i = 1:N 
     phi = f + K*phi 
    end 

其中phi_nf是對(x_i)phif節點的值。

+0

感謝您的回答!我想我明白你在做什麼,但你能否擴展你對l_j(s)的解釋?特別是「例如,第j拉格朗日內插......」 – Linda