2013-05-15 9 views
5

Wir haben eine Gleichung ähnlich der Fredholm integral equation der zweiten Art.Implementieren der iterativen Lösung der Integralgleichung in Matlab

enter image description here

Um diese Gleichung zu lösen wir eine iterative Lösung, die garantiert konvergieren für unsere spezifische Gleichung gegeben wurden. Jetzt besteht unser einziges Problem darin, dieses iterative Verfahren in MATLAB zu implementieren.

Vorerst sieht der problematische Teil unseres Code wie folgt:

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 ist eine Funktion der x und den Anfangswert der Iteration darstellen. ms ist eine Funktion von x und xi.

Wie Sie vielleicht sehen können, wollen wir delt sowohl von x (vor dem Integral) als auch xi (innerhalb des Integrals) in der Iteration abhängen. Leider gibt uns diese Art, den Code (mit der Funktion handle) zu schreiben, keinen numerischen Wert, wie wir es wünschen. Wir können delt nicht als zwei verschiedene Funktionen schreiben, eine von x und eine von xi, da xi nicht definiert ist (bis integral definiert es). Also, wie können wir sicherstellen, dass delt von xi innerhalb des Integrals abhängt, und immer noch einen numerischen Wert aus der Iteration bekommen?

Haben Sie irgendwelche Vorschläge, wie wir das lösen könnten?

mittels numerischer Integration

Erläuterung der Eingabeparameter: x ein Vektor von numerischen Werten ist, der Rest sind Konstanten. Ein Problem mit meinem Code ist, dass der Eingabeparameter x nicht benutzt wird (ich denke, das bedeutet, dass x als Symbol behandelt wird).

+1

Verwenden Sie symbolische oder numerische Integration? – Jan

+0

@Jan Numerische Integration. (Bearbeitete meine Frage) – Linda

+0

Vielleicht ist 'x' der Vektor von Gitterpunkten, wo Ihre Funktion angenähert werden soll ....? – Jan

Antwort

0

Es sieht aus wie Sie eine Verschachtelung von anonymen Funktionen in MATLAB tun können:

f = 

    @(x)2*x 

>> ff = @(x) f(f(x)) 

ff = 

    @(x)f(f(x)) 

>> ff(2) 

ans = 

    8 

>> f = ff; 


>> f(2) 

ans = 

    8 

Auch ist es möglich, die Zeiger auf die Funktionen erneut zu binden.

So können Sie Ihre Iteration wie

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 der Aufnahme Ihrer Parameter ...

+0

Vielen Dank für Ihre Antwort! Das Problem mit meinem Code und deinem ist, dass der Funktionseingabeparameter x nicht benutzt wird. x ist ein Vektor und muss in der Iteration verwendet werden. – Linda

0

Sie betrachten wünschen können einrichten, um eine diskretisierte Version Ihr Problem zu lösen.

Lassen Sie K die Matrix sein, die Ihren Fredholm-Kernel k(t,s), z.

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

wo l_j(s) ist, zum Beispiel, die j-te lagrange interpolant zu dem zugehörigen Knoten (x_i) = x_1,x_2,...,x_n Interpolation.

Dann Ihre Iterationen Picard Lösung ist so einfach wie tun

phi_n+1 = f + K*phi_n 

heißt

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

wo phi_n und f sind die Knotenwerte von phi und f auf dem (x_i).

+0

Danke für Ihre Antwort! Ich denke, ich verstehe, worauf Sie hinauswollen, aber könnten Sie Ihre Erklärung von l_j (s) erweitern? Insbesondere "zum Beispiel der j-te Lagrange-Interpolant ..." – Linda

Verwandte Themen