2013-05-15 23 views
5

Abbiamo un'equazione simile al Fredholm integral equation di secondo tipo.Implementazione della soluzione iterativa dell'equazione integrale in Matlab

enter image description here

risolvere questa equazione c'è stata data una soluzione iterativa che è garantito per convergere per la nostra specifica equazione. Ora il nostro unico problema consiste nell'implementare questa prodezza iterativa in MATLAB.

Per il momento, la parte problematica del nostro codice si presenta così:

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 è una funzione di x, e rappresentano il valore iniziale del iterazione. ms è una funzione di x e xi.

Come si può vedere che vogliamo delt dipendere sia x (prima l'integrale) e xi (all'interno dell'integrale) nella iterazione. Sfortunatamente questo modo di scrivere il codice (con la funzione handle) non ci dà un valore numerico, come desideriamo. Non è possibile scrivere delt come due funzioni diverse, una di x e una di xi, poiché xi non è definita (fino a quando lo definisce integral). Quindi, come possiamo assicurarci che l'delt dipenda dall'xi all'interno dell'integrale e ottenga ancora un valore numerico dall'iterazione?

Qualcuno di voi ha qualche suggerimento su come potremmo risolvere questo?

utilizzando l'integrazione numerica

Spiegazione dei parametri di ingresso: x è un vettore di valori numerici, tutto il resto sono costanti. Un problema con il mio codice è che il parametro di input x non viene utilizzato (suppongo che questo significhi che x sia trattato come un simbolo).

+1

Utilizzi l'integrazione simbolica o numerica? – Jan

+0

@Jan Integrazione numerica. (Modificata la mia domanda) – Linda

+0

Forse 'x' è il vettore dei punti della griglia in cui la tua funzione deve essere approssimata ....? – Jan

risposta

0

Sembra che si può fare un annidamento di funzioni anonime in 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 

Inoltre è possibile associare nuovamente i puntatori alle funzioni.

Pertanto, è possibile impostare l'iterazione come

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 

più l'inserimento dei vostri parametri ...

+0

Grazie per la risposta! Il problema con il mio codice e il tuo è che il parametro di input della funzione x non viene utilizzato. x è un vettore e deve essere usato nell'iterazione. – Linda

0

Si può prendere in considerazione per risolvere una versione discretizzata del problema.

Sia la K la matrice che discretizza il kernel di Fredholm k(t,s), ad es.

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

dove l_j(s) è, per esempio, il j-esimo lagrange interpolant associate ai nodi di interpolazione (x_i) = x_1,x_2,...,x_n.

Poi, risolvere i vostri iterazioni Picard è semplice come fare

phi_n+1 = f + K*phi_n 

cioè

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

dove phi_n e f sono i valori nodali di phi e f sul (x_i).

+0

Grazie per la tua risposta! Penso di capire cosa stai ottenendo, ma potresti estendere la tua spiegazione di l_j (s)? Soprattutto "per esempio, il j-esimo interpolant lagrange ..." – Linda