AIUTO_MATLAB

di il
11 risposte

AIUTO_MATLAB

Buongiorno a tutti sono nuova del forum. Scrivo perchè ho un estremo bisogno di aiuto! Per sostenere un esame di Calcolo Numerico, devo elaborare dei progetti in linguaggio di programmazione Matlab. Mi trovo in difficoltà su due esercizi, che ho già svolto interamente, ma che presentano delle imprecisioni che non riesco a correggere. Qualche buona anima pia sarebbe disposta (sotto compenso ovviamente) a darmi una mano? Ringrazio anticipatamente chi mi risponderà

11 Risposte

  • Re: AIUTO_MATLAB

    Perché non cominci a proporre il problema per vedere se qualcuno ti aiuta a prescindere?
  • Re: AIUTO_MATLAB

    Oregon hai ragione. Allora inserisco il primo progetto. Il testo è questo:
    Sull’intervallo [0,12] è definita una funzione continua f(x) che è nota solo sui nodi
    di un reticolo uniforme con passo h=1 ed assume gli stessi valori indicati dalle
    ultime 5 cifre del tuo numero di matricola seguite da ciascuna cifra della tua data di
    nascita (ggmmaaaa). Ad esempio, per chi ha numero di matricola 123456 ed è
    nato il 26 ottobre 2017, yi=f(xi) assumerà i valori 2, 3, 4, 5, 6, 2, 6, 1, 0, 2, 0, 1, 7.
    Su di un grafico tracciare l'approssimazione di f(x) ottenuta sia tramite spline
    cubica naturale che con il metodo dei minimi quadrati dopo aver supposto che f(x)
    sia funzione lineare di x. Infine, calcolare un'approssimazione dell'integrale di f(x)
    sull'intero intervallo [0,12] usando il metodo di Simpson.
  • Re: AIUTO_MATLAB

    Quindi questo esercizio l'ho risolto così: ho implementato il codice per le spline cubiche, quello per il calcolo dei minimi quadrati, dell'integrale con il metodo di simpson e il metodo di Thomas. Metto gli screen dei codici:
    **SCRIPT**
    % clc
    clear all
    close all

    a= 0;
    b=12;
    n=12;


    %epsilon=1.0e-10;
    x=linspace(a,b,n+1);
    y=[5,4,1,9,0,0,4,0,1,1,9,9,1]% data di nascita: 04-01-1991
    % numero di matricola: 154190

    %y=[1,6,0,5,1,9,9,6,7,6,3,9,0] % verifico con un vettore preso a caso
    %y=[1,1,1,1,1,1,1,1,1,1,1,1,1]% Verifica con un vettore con tutte componenti uguali a 1

    x2= linspace(a,b,1000);

    y2 = mieSpline(x,y,x2); % Interpolazione con Spline cubiche
    y3 = MinimiQuadrati(x,y,x2);% Interpolazione con Metodo dei Minimi Quadrati
    %y4=polyfit(x,y,1);


    % Soluzione dell'integrale con il metodo di Simpson
    [I, m]= Simpson(y,a,b,n);
    %[I, m]= Simpson(y,a, b, epsilon,1);
    %fprintf( 'Metodo dei Simpson: I=%f, errore=%e, n=%d\n', I, 1-I,m)
    fprintf( 'Metodo dei Simpson: I=%f\n', I)


    plot(x,y,'ro',x2,y2,'g','linewidth',2)
    hold on

    plot(x2, y3, 'b','linewidth',2)
    hold on
    %plot(x, y4(2)+y4(1)*x, 'b','linewidth',2)
    %hold on

    axis([0,14,-2,15]);
    title(['Studente: Lorena Baio. Numero di matricola: 154190. Integrale risolto con il Metodo di Simpson: ',num2str(I)])
    legend('Funzione discreta','Funzione ottenuta con Spline Cubiche','Funzione ottenuta con Minimi Quadrati')
    xlabel('x')
    ylabel('y(x)')
  • Re: AIUTO_MATLAB

    **METODO DI THOMAS**
    %FUNZIONE METODO DI THOMAS

    function [x] = Thomas (A,b)

    n = length(b);
    [k,l] = size(A);

    if k~=l || n~=k
    x = NaN;
    return;
    end

    p = zeros(n,1);
    q = zeros(n-1,1);
    p(1) = A(1,1);

    for j = 2:n
    q(j-1) = A(j-1,j)/p(j-1);
    p(j) = A(j,j)-A(j,j-1)*q(j-1);
    end

    z = zeros(n,1);
    z(1) = b(1)/p(1);

    for j = 2:n
    z(j) = (b(j)-A(j,j-1)*z(j-1))/p(j);
    end

    x = zeros(n,1);
    x(n) = z(n);

    for j = n-11
    x(j) = z(j)-q(j)*x(j+1);
    end
    end
  • Re: AIUTO_MATLAB

    **METODO DELLE SPLINE CUBICHE**
    function yy = mieSpline(x,y,xx)
    n=length(x)-1;
    h=(x(n+1)-x(1))/n;

    if any(xx<x(1)) || any(xx>x(n+1));
    disp('xx fuori intervallo');
    return;
    end

    if n>1
    A=diag(ones(n-2,1),-1)+4*eye(n-1)+diag(ones(n-2,1),1);
    b=6*(y(3:n+1)-2*y(2:n)+y(1:n-1))'/h^2;
    z=[0;Thomas(A,b);0];
    end
    if n==1
    z=[0;0];
    end

    yy=zeros(1,length(xx));

    for i=2:n+1
    m=xx>=x(i-1) & xx<=x(i);
    c1=(y(i)-y(i-1))/h - h*(z(i)-z(i-1))/6;
    c2=y(i-1)-z(i-1)*h^2/6;
    yy(m)=z(i-1)*(x(i)-xx(m)).^3/(6*h) + z(i)*(xx(m)-x(i-1)).^3/(6*h) + c1*(xx(m)-x(i-1))+c2;
    end
    end
  • Re: AIUTO_MATLAB

    **METODO DEI MINIMI QUADRATI**
    %Funzione Minimi Quadrati

    function yy = MinimiQuadrati(x,y,xx)

    n = length(x);
    A = zeros(2);
    b = zeros(2,1);
    a = zeros(2,1);

    A(1,1)= n;
    for i=1:n
    A(1,2)= A(1,2) + x(i);
    A(2,1)= A(2,1) + x(i);
    A(2,2)= A(2,2) + x(i)^2;
    b(1)= b(1) + y(i);
    b(2)= b(2) + x(i)*y(i);
    end

    a = Thomas(A,b);
    % a = Gauss0(A,b);

    %yy = a(1)+a(2)*xx;
    yy = a(1)+a(2)*xx;
    end
  • Re: AIUTO_MATLAB

    **METODO DI SIMPSON**
    % Calcolo l'integrale con il metodo di simpson

    function[I, n]= Simpson(f,a,b,p4,f4)
    if nargin < 5 %se il numero degli argomenti ? <5 entra nel ciclo
    n = p4;

    if rem(n,2)>0
    I=0;
    disp( 'Attenzione "n" deve essere pari!')
    return
    end

    else
    epsilon=p4;
    % n=2*ceil(0.5*((b-a)^5*f4/(180*epsilon))^(1/4));
    n=ceil(((b-a)^5*f4/(180*epsilon))^(1/4));
    end

    h=(b-a)/n;
    y=[0,4,0,1,1,9,9,1,5,4,1,9,0];

    I=(h/3)*sum([y(1), 4*y(2:2:n), 2*y(3:2:n-1), y(n+1)]);
    end
  • Re: AIUTO_MATLAB

    Il testo del secondo problema:
    Progetto 3: Usando il metodo ibrido su un reticolo uniforme con passo h=1,
    determinare la soluzione del seguente problema ai limiti
    y'' + f(x) ( y' -(1/10)*y)=0,
    0<x<12
    y(0) = y(12) = 1
    dove, nei nodi, la funzione f(xi), i=0,1,2,…,12, è la stessa già utilizzata nel
    Progetto 1. Tracciare il grafico di y(x) e riportare un'approssimazione
    dell'integrale di y(x) sull'intervallo [0,12] ottenuto con il metodo dei trapezi.

    Per risolvere questo problema ho costruito la funzione del metodo ibrido lineare, il metodo di Thomas postato sopra e il metodo dei trapezi. L'errore in questo caso credo sia nell'assunzione dei punti della funzione (dovrebbero essere in totale 13), ma assumendone 13 automaticamente matlab mi da un errore per quanto riguarda le dimensioni della matrice.
  • Re: AIUTO_MATLAB

    **SCRIPT**
    clear all
    close all

    n = 12;
    a = 0;
    b = 12;
    % data di nascita 04-01-1991, matricola: 154190
    P = [5,4,1,9,0,0,4,0,1,1,9];
    Q = -(1/10).*P;

    alfa = 1;
    beta = 1;

    %h = (b-a)/n;
    % il passo assegnato ? pari al valore di 1
    h=1;
    x = a+h:h:b-h;
    %x=1:1:13;

    [y] = metodo_ibrido_lineare(P,Q,alfa,beta,h,n);

    [I,m] = trapezi(y,a,b,n);
    plot([a x b] , [y] ,'ro');
    title(['Studente: Lorena Baio, Numero di matricola: 154190; Integrale risolto con il Metodo dei Trapezi: ',num2str(I)])
    xlabel('x')
    ylabel('y(x)')
  • Re: AIUTO_MATLAB

    **METODO IBRIDO LINEARE**
    function [y] = metodo_ibrido_lineare(P,Q,alfa,beta,h,n)

    p = P;
    q = Q;
    ap = abs(p);

    teta = ones(1,n-1);
    mask = h*ap>=2;
    teta(mask) = 1.9./(h*ap(mask));

    L = 2+h*((1-teta).*(ap-p)-teta.*p);
    D = -(4+2*h*(1-teta).*ap)+2*(h^2)*q;
    U = 2+h*((1-teta).*(ap+p)+teta.*p);

    A = diag(L(2:n-1),-1)+diag(D)+diag(U(1:n-2),1);
    b = -[L(1)*alfa; zeros(n-3,1); U(n-1)*beta];

    y = [alfa; Thomas(A,b); beta];

    end
  • Re: AIUTO_MATLAB

    **METODO DEI TRAPEZI**
    %FUNZIONE METODO DEI TRAPEZI

    function [I,n] = trapezi(y,a,b,p4,f2)

    if nargin < 5
    n = p4;
    else
    epsilon = p4;
    n = ceil(sqrt((b-a)^3*f2/(12*epsilon)));
    end

    h = (b-a)/n;
    %y = f(a:h:b); % stesso discorso per la prima relazione, non serve
    %I = 0.5*h*sum([y(1),2*y(2:n),y(n+1)]);
    I = 0.5*h*sum([y(1);2*y(2:n);y(n+1)]);
    end
Devi accedere o registrarti per scrivere nel forum
11 risposte