【问题标题】:Implementing iterative solution of integral equation in Matlab在Matlab中实现积分方程的迭代求解
【发布时间】:2013-05-10 05:07:17
【问题描述】:

我们有一个类似于第二类Fredholm integral equation 的方程。

为了求解这个方程,我们得到了一个迭代解,它保证收敛于我们的特定方程。现在我们唯一的问题在于在 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 被视为一个符号)。

【问题讨论】:

  • 你使用符号积分还是数值积分?
  • @Jan 数值积分。 (编辑我的问题)
  • 也许x 是要逼近您的函数的网格点的向量......?

标签: matlab iteration equation integral


【解决方案1】:

看起来你可以在 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

加上你的参数...

【讨论】:

  • 感谢您的回答!我的代码和你的代码的问题是函数输入参数 x 没有被使用。 x 是一个向量,它必须在迭代中使用。
【解决方案2】:

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

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_nf(x_i)phif 的节点值。

【讨论】:

  • 感谢您的回答!我想我理解你的意思,但你能扩展你对 l_j(s) 的解释吗?特别是“例如,第 j 个拉格朗日插值......”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
相关资源
最近更新 更多