2013-05-15 2 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_a является функцией x, и представляет собой начальное значение итерации. ms - это функция от x и xi.

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

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

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

Объяснение входных параметров: х представляет собой вектор числовых значений, все остальные являются константами. Проблема с моим кодом заключается в том, что входной параметр 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_n где и f являются узловые значения phi и f на (x_i).

+0

Спасибо за ваш ответ! Я думаю, что понимаю, что вы получаете, но не могли бы вы расширить свое объяснение l_j (s)? Особенно «например, j-й лагранжевый интерполятор ...» – Linda

Смежные вопросы