在Matlab中实现积分方程的迭代解

时间:2013-05-15 14:47:54

标签: matlab iteration equation integral

我们有一个类似于第二类Fredholm integral equation的等式。

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(积分之内)。不幸的是,这种编写代码的方式(使用函数句柄)并没有像我们希望的那样给出数值。我们不能将delt写为两个不同的函数,x之一和xi之一,因为xi未定义(直到integral定义它)。那么,我们如何确保delt依赖于积分内的xi,并且仍然可以从迭代中获得数值?

你们有什么建议我们如何解决这个问题?

使用数值积分

输入参数的说明:x是数值的向量,其余都是常量。我的代码的一个问题是没有使用输入参数x(我猜这意味着x被视为符号)。

2 个答案:

答案 0 :(得分: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

加上你的参数......

答案 1 :(得分:0)

您可能需要考虑解决问题的离散化版本。

K成为离散Fredholm内核k(t,s)的矩阵,例如

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

例如,l_j(s)是与插值节点(x_i) = x_1,x_2,...,x_n关联的第j lagrange interpolant

然后,解决Picard迭代就像执行

一样简单
  phi_n+1 = f + K*phi_n

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

其中phi_nfphif(x_i)的节点值。