Advertisement
Guest User

Untitled

a guest
Jul 15th, 2019
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.23 KB | None | 0 0
  1. format long e
  2.  
  3. f=@(x)1./(1+x.^2);
  4. z=linspace(-5, 5, 10001)';
  5. lebesgueConstanti=zeros(20, 1);
  6.  
  7. lebesgueEquidistanti(f,z,lebesgueConstanti);
  8. % lebesgueCheby(f,z,lebesgueConstanti);
  9.  
  10. function lebEqui = lebesgueEquidistanti(f,z,lebesgueConstanti)
  11. % Utilizzo: lebesgueEquidistanti(f,z,lebesgueConstanti)
  12. % Funzione che calcola la costante di lebesgue per polinomi
  13. % interpolanti di grado n:2...40 su ascisse equidistanti
  14. %
  15. % Parametri:
  16. % f: Funzione da approssimare
  17. % z:
  18. % lebesgueConstanti: vettore per memorizzare le costanti calcolate
  19. %
  20. iteraz=0;
  21. for n=2:2:40
  22. xi = zeros (1 , n+1);
  23. fxi = zeros(1,n+1);
  24. for i = 1:n+1
  25. xi(i) = -5+(i-1)*(10/n);
  26. end
  27. for i = 1:n+1
  28. fxi(i) = feval(f, xi(i));
  29. end
  30. fx=zeros(1, 10001); %valori nelle 10001 ascisse uniformi
  31. lebesgueConstanti(n/2) = norm(lebesgue(xi),inf);
  32. y=NewtonPol(xi, fxi,z);
  33. err=max(abs(fx-y'));
  34. iteraz = iteraz +1;
  35. rst(iteraz,1) = n;
  36. rst(iteraz,2)=err;
  37. rst(iteraz,3)=lebesgueConstanti(n/2);
  38. fprintf('n= %i, errore= %e, lambda= %e\n', n, err, lebesgueConstanti(n/2));
  39. end
  40. plot(lebesgueConstanti);
  41. title('Costante di Lebesgue (Ascisse Equidistanti');
  42. colNames = {'n','errore','norma'};
  43. tableResult = array2table(rst,...,
  44. 'VariableNames',colNames);
  45. disp(tableResult);
  46. end
  47.  
  48. function lebCheb = lebesgueCheby(f,z,lebesgueConstanti)
  49. % Utilizzo: lebesgueEquidistanti(f,z,lebesgueConstanti)
  50. % Funzione che calcola la costante di lebesgue per polinomi
  51. % interpolanti di grado n:2...40 su ascisse equidistanti
  52. %
  53. % Parametri:
  54. % f: Funzione da approssimare
  55. % z:
  56. % lebesgueConstanti: vettore per memorizzare le costanti calcolate
  57. %
  58. iteraz = 0;
  59. for n=2:2:40
  60. xi = zeros (1 , n+1);
  61. fxi = zeros(1,n+1);
  62. for i = 1:n+1
  63. xi = chebyshev(n, -5, 5);
  64. xi = sort(xi);
  65. end
  66. for i = 1:n+1
  67. fxi(i) = feval(f, xi(i));
  68. end
  69. fx=zeros(1, 10001); %valori nelle 10001 ascisse uniformi
  70. lebesgueConstanti(n/2) = norm(lebesgue(xi),inf);
  71. y=lagrange(xi, fxi,z);
  72. err=max(abs(fx-y'));
  73. iteraz = iteraz +1;
  74. rst(iteraz,1) = n;
  75. rst(iteraz,2)=err;
  76. rst(iteraz,3)=lebesgueConstanti(n/2);
  77. fprintf('n= %i, errore= %e, lambda= %e\n', n, err, lebesgueConstanti(n/2));
  78.  
  79. end
  80. plot(lebesgueConstanti);
  81. title('Costante di Lebesgue (Ascisse di Chebyshev');
  82. colNames = {'n','errore','norma'};
  83. tableResult = array2table(rst,...,
  84. 'VariableNames',colNames);
  85. disp(tableResult);
  86. end
  87.  
  88.  
  89. function y = lagrange(xi, fi, x)
  90. % y = lagrange(xi, fi, x)
  91. % Funzione per il calcolo del polinomio interpolante per le coppie di dati (xi,fi) nei
  92. % punti del vettore x, con il metodo di lagrange.
  93. % Metodo utilizzato: Lagrange.
  94. %
  95. % Parametri:
  96. % xi: ascisse di interpolazione
  97. % fi: valori della funzione nelle ascisse di interpolazione
  98. % x: ascisse dove valutare il polinomio, Metodo: lagrange
  99. % Restituisce:
  100. % y: valutazione delle ascisse in x
  101. %
  102. if length(xi) - length(fi) ~= 0
  103. error("La lunghezza dei vettori xi e fi non é la stessa.")
  104. end
  105. if isempty(x)
  106. error("Vettore x vuoto.")
  107. end
  108. n = length(xi)-1;
  109. for i=1:n % Controllo che tutte le ascisse siano distinte
  110. for j=i+1:n
  111. if xi(i)==xi(j)
  112. error("Le ascisse non sono tutte distinte");
  113. end
  114. end
  115. end
  116. y = zeros(size(x));
  117. % per ogni ascissa in x
  118. for i=1:length(x)
  119. % calcolo del valore del polinomio
  120. for k=1:n+1
  121. lkn = 1;
  122. % calcolo di lkn
  123. for j=1:n+1
  124. if (j~=k)
  125. lkn = lkn.*((x(i)-xi(j))/(xi(k)-xi(j)));
  126. end
  127. end
  128. y(i) = y(i) + fi(k)*lkn;
  129. end
  130. end
  131. return
  132. end
  133.  
  134.  
  135. function leb = lebesgue(puntiInterp)
  136. % Utilizzo: leb = lebesgue(puntiInterp)
  137. % Funzione per il calcolo della costante di lebesgue
  138.  
  139. % Parametri:
  140. % puntiInterp: punti di interpolazione
  141.  
  142. % Restituisce:
  143. % y: Costante di lebesgue
  144. npunti = length(puntiInterp);
  145. lin=zeros(10001,1);
  146. x=linspace(-5,5,10001);
  147. for j=1:10001
  148. k=0;
  149. for i=1:npunti
  150. val=abs(lagrangePol(puntiInterp,x(j),i));
  151. k=k+val;
  152. end
  153. lin(j,1)=k;
  154. end
  155. leb=lin;
  156. return
  157. end
  158.  
  159.  
  160. function valPol = lagrangePol(z,x,i)
  161. % Utilizzo: lagrangePol(z,x,i)
  162. % Funzione per il calcolo dell' i-esimo polinomio di Lagrange
  163. %
  164. % Parametri:
  165. %
  166. % z: punti di interpolazione
  167. % x: punto su cui effettuare la valutazione
  168. % i: indice del polinomio
  169. %
  170. % Restituisce:
  171. % valPol: Valore del polinomio in x
  172.  
  173. n = length(z); m = length(x);
  174. valPol = prod(repmat(x,1,n-1)-repmat(z([1:i-1,i+1:n]),m,1),2)/...
  175. prod(z(i)-z([1:i-1,i+1:n]));
  176. return
  177. end
  178.  
  179.  
  180. function xi = chebyshev(n, a, b)
  181. % xi = ceby(n, a, b)
  182. % Calcola le ascisse di Chebyshev per il polinomio di grado n
  183. % trasformate in [a,b]
  184. %
  185. % Parametri:
  186. % n: grado del polinomio interpolante
  187. % a: estremo sinistro
  188. % b: estremo destro
  189. %
  190. % Restituisce:
  191. % xi: ascisse di Chebyshev
  192.  
  193. if n<=0
  194. error('Il numero n inserito deve essere maggiore di 0.')
  195. end
  196. xi = cos((2*[0:n]+1)*pi/(2*n+2));
  197. xi = ((a+b)+(b-a)*xi)/2;
  198. return
  199. end
  200.  
  201.  
  202.  
  203. function y = NewtonPol( xi , fi,x ) %
  204. %y=newton(x, xi, f)
  205. % Calcola il polinomio interpolante le coppie (xi , fi ) con la forma di % Newton nelle ascisse x
  206. n= length(xi) ;
  207. if n~=length(fi), error('Dati incosistenti'); end
  208. for i=1:n-1
  209. for j=i+1:n
  210. if xi(i)==xi(j), error('Ascisse non distinte'); end
  211. end
  212. end
  213. f=difdiv(xi, fi); y= f ( n ) ;
  214. for i=n-1:-1:1
  215. y= f ( i ) + ( x-xi( i ) ).* y ;
  216. end
  217. return
  218. end
  219.  
  220.  
  221. function f=difdiv(xi, fi)
  222. % f=difdiv(xi, fi)
  223. %
  224. % Calcolo delle differenze divise date le coppie di valori xi e fi ,
  225. % rispettivamente le ascisse e i valori assunti dalla funzione in queste .
  226. n= length(fi) ; f=fi ;
  227. for i=1:n-1
  228. for j=n:-1:i+1 f(j)=(f(j)-f(j-1))/(xi(j)-xi(j-i ));
  229. end
  230. end
  231. return
  232. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement