2013-05-15 12 views
5

Mamy równanie podobne do Fredholm integral equation drugiego rodzaju.Implementacja iteracyjnego rozwiązania równania całkowego w Matlab

enter image description here

W celu rozwiązania tego równania otrzymaliśmy iteracyjnego rozwiązania, które są gwarantowane do zbiegają się do naszego konkretnego równania. Teraz naszym jedynym problemem jest implementacja tej iteracyjnej procedury w MATLAB.

Na razie problematyczna część naszego kodu wygląda następująco:

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 jest funkcją x i stanowią wartość początkową iteracji. ms jest funkcją x i xi.

Jak widać, chcemy, aby delt zależało zarówno od x (przed całką), jak i od (wewnątrz integralnej) w iteracji. Niestety, ten sposób pisania kodu (z uchwytem funkcji) nie daje nam wartości liczbowej, jak chcemy. Nie możemy ani napisać delt jako dwóch różnych funkcji, jednej z x i jednej z xi, ponieważ xi nie jest zdefiniowana (aż integral ją zdefiniuje). W jaki sposób możemy się upewnić, że delt zależy od całki i nadal uzyskać wartość liczbową z iteracji?

Czy ktoś z was ma jakieś sugestie, jak możemy rozwiązać ten problem?

za pomocą numerycznego

Wyjaśnienie parametry wejściowe: x jest wektorem wartości liczbowych, reszta są stałymi. Problem z moim kodem polega na tym, że parametr wejściowy x nie jest używany (domyślam się, że oznacza to, że x jest traktowany jako symbol).

+1

Czy używasz symbolicznej lub numerycznej integracji? – Jan

+0

@Jan Integracja numeryczna. (Zmieniono moje pytanie) – Linda

+0

Może 'x' jest wektorem punktów siatki, gdzie twoja funkcja ma być przybliżona ...? – Jan

Odpowiedz

0

Wygląda jak można zrobić zagnieżdżanie funkcji anonimowych w 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 

Również możliwe jest ponownie powiązać te wskaźniki do funkcji.

sposób można skonfigurować iteracji jak

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 

plus włączenia swoimi parametrami ...

+0

Dziękuję za odpowiedź! Problem z moim kodem tak jak i twoim polega na tym, że parametr wejściowy funkcji x nie jest używany. x jest wektorem i musi być użyty w iteracji. – Linda

0

może warto rozważyć rozwiązać Discretized wersję swojego problemu.

Niech macierz K będzie matrycą, która dyskretyzuje twoje jądro Fredholma k(t,s), np.

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

gdzie l_j(s) jest, na przykład, j-ty lagrange interpolant związane z węzłów interpolacji (x_i) = x_1,x_2,...,x_n.

Następnie rozwiązywania iteracji Picarda jest tak proste, jak robi

phi_n+1 = f + K*phi_n 

tj

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

gdzie phi_n i f są węzłowe wartości phi i f na (x_i).

+0

Dzięki za odpowiedź! Myślę, że rozumiem, do czego zmierzasz, ale czy mógłbyś rozszerzyć swoje wyjaśnienie dla l_j (s)? Zwłaszcza "na przykład j-th interpolant lagrange ..." – Linda