Реализация итеративного решения интегрального уравнения в Matlab

У нас есть уравнение, похожее на интегральное уравнение Фредгольма второго рода.

введите здесь описание изображения

Для решения этого уравнения нам дали итеративное решение, которое гарантированно сходится для нашего конкретного уравнения. Теперь наша единственная проблема состоит в реализации этой итерационной процедуры в 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_a является функцией x и представляет начальное значение итерации. ms является функцией x и xi.

Как видите, мы хотим, чтобы delt зависело как от x (до интеграла), так и от xi (внутри интеграла) в итерации. К сожалению, такой способ написания кода (с дескриптором функции) не дает нам числового значения, как мы того хотели. Мы также не можем записать delt как две разные функции, одну из x и одну из xi, поскольку xi не определена (пока integral не определена). Итак, как мы можем убедиться, что delt зависит от xi внутри интеграла, и при этом получить числовое значение из итерации?

У кого-нибудь из вас есть предложения, как мы могли бы решить эту проблему?

Использование числового интегрирования

Объяснение входных параметров: x — вектор числовых значений, все остальные — константы. Проблема с моим кодом заключается в том, что входной параметр x не используется (я думаю, это означает, что x обрабатывается как символ).


person Linda    schedule 15.05.2013    source источник
comment
Используете ли вы символическое или численное интегрирование?   -  person Jan    schedule 15.05.2013
comment
@Jan Численное интегрирование. (Отредактировал мой вопрос)   -  person Linda    schedule 16.05.2013
comment
Может быть, x - это вектор точек сетки, где ваша функция должна быть аппроксимирована ....?   -  person Jan    schedule 16.05.2013


Ответы (2)


Похоже, вы можете сделать вложение анонимных функций в 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

плюс включение ваших параметров...

person Jan    schedule 15.05.2013
comment
Спасибо за ваш ответ! Проблема с моим кодом, как и с вашим, заключается в том, что входной параметр функции x не используется. x — это вектор, и его нужно использовать в итерации. - person Linda; 16.05.2013

Возможно, вы захотите рассмотреть возможность решения дискретизированной версии вашей проблемы.

Пусть K будет матрицей, которая дискретизирует ваше ядро ​​Фредгольма k(t,s), например.

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

где l_j(s) — это, например, j-й интерполянт Лагранжа, связанный с узлами интерполяции (x_i) = x_1,x_2,...,x_n.

Тогда решение ваших итераций Пикарда так же просто, как выполнение

  phi_n+1 = f + K*phi_n

i.e.

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

где phi_n и f — узловые значения phi и f на (x_i).

person Acorbe    schedule 15.05.2013
comment
Спасибо за Ваш ответ! Думаю, я понимаю, к чему вы клоните, но не могли бы вы расширить свое объяснение l_j(s)? Особенно, например, j-й интерполянт Лагранжа... - person Linda; 16.05.2013