Octave

Co to je

Scripty

Výstup

Výstup je možný několika způsoby. Pokud se nedá na konec řádku znak ';', pak se automaticky vypisuje výsledek každé operace. Pro formátovaný výstup se používá funkce printf(), která může vypadat nějak takto:

x = 10.1;
y = 5.5;
z = 'test';
printf('Integer: %i. Realne cislo: %f. String: %s.\n', x, y, z);

Maticové rovnice

Řešení maticové rovnice Ax=b pomocí LU rozkladu

function x=test_lu(A,b)
  [L,U,p]=lu(A,'vector');
  opL.LT = true;
  opU.UT = true;
  x=linsolve(U,linsolve(L,b(p),opL),opU);
end

Řešení maticové rovnice Ax=b pomocí Gaussovy eliminace

function x=test_gauss(A,b)
  x=A\b
end

Řešení maticové rovnice Ax=b hrubou silou

function x=test_hruba(A,b)
  x=inv(A)*b
end

Řešení diferenciální rovnic druhého řádu metodou konečných diferencí

function u = reseni2(n,l)
% n - pocet dilku
% l - delka intervalu
  h = l/n;
  e = ones(n-1,1);
  A = spdiags([-e 2*e -e], -1:1, n-1, n-1);
  b = e*h.^2; %tecka znamena po slozkach
  u=A\b;
  x = 0:0.1:l;
  y = 0.5*x.*(l-x);
  plot(x,y,'-r',(1:n-1)*h,u,'+b');
end

Matlab

Hledani korenu polynomu

roots([1 2 2])
poly([1 2 3])
P=[1 2 3]
Q=[3 2 1]
R=conv(P,Q)
[K,L]=deconv(R,Q)

Interpolace funkce

function interpolace(A,B)
    plot([A(1) B(1)], [A(2) B(2)],'+r');
    x=(-400:400)*pi/100;
    p=line(x,fce(x,1,2));
    axis([0 5 0 3])
    tx=text(0.1,2,'1/(1+2x^2)','Color',[0 0 1]);
    set(gca,'UserData',[10 100]);
    set(gcf,'KeyPressFcn',@(s,t)klavesy(t,p,x,tx,A,B))
end

function klavesy(t,P,x,tx,A,B)
    data=get(gca,'UserData');
    u=data(1);
    v=data(2);
    switch(t.Key)
        case 'leftarrow'
            v=v-1;
        case 'rightarrow'
            v=v+1;
        case 'uparrow'
            u=u+1;
        case 'downarrow'
            u=u-1;
        case 'p'
            print('-dpng',['graf' num2str(u) '_' num2str(v) '.png'])
    end
    set(gca,'UserData',[u,v]);
    u=u/10;
    v=v/1000;
    set(P,'YData',fce(x,u,v));
    set(tx,'string',[num2str(u) '/(1+' num2str(v) 'x^2) ' num2str(fce(A(1),u,v)-A(2)) ' ' num2str(fce(B(1),u,v)-B(2))]);
end
function y=fce(x,a,b)

y=a*exp(-b*x.^2);
end

Prace s ridkymi maticemi

n=8;
e = ones(n,1);
A = spdiags([-e 2*e -e], -1:1, n, n)
B=full(A)
sparse(B)
%% LU rozklad
% pouziti lu rozkladu pro ridke matice
[L,U]=lu(A);
full(L)
full(U)
%% Inverze ridke matice
full(inv(A))

Reseni nelinearnich rovnic

% x1=x0-f(x0)/f'(x0)

[x,f,s]=fsolve(@(x)tan(x)-0.2*x,3.8,optimset('Display','iter'))
[x,f,s]=fsolve(@(x)tan(x)-0.2*x,3.8,optimset('Display','off'))

reseninelinrov.m:

function [x,f,g]=reseninelinrov(A)
    %A=0.25;
    opt=optimset('Jacobian','on','Display','iter');
    
    ezplot(@tan,[0 12]);
    line([0 12],[0 A*12]);
    line([0 12],[0 0],'Color',[0 0 0]);
    
    [x,f,g]=fsolve(@(x)fce(x,A),4,opt);
    line([x x],[0 tan(x)],'Color','red');
    
    [x,f,g]=fsolve(@(x)fce(x,A),7,opt);
    line([x(1) x(1)],[0 tan(x(1))],'Color','red');
    
    [x,f,g]=fsolve(@(x)fce(x,A),10,opt);
    line([x(1) x(1)],[0 tan(x(1))],'Color','red');

    axis equal;
end
function [y,yd]=fce(x,a)
    y=sin(x)-a*x*cos(x);
    yd=(1-a)*cos(x)+a*x*sin(x);
end

Reseni nelinearnich rovnic s automatickou iteraci

function reseninelinrov2(A)
    x=4;
    ezplot(@(x)tan(x),[0 18]);
    line([0 18],[0 A*18])
    line([0 18],[0 0],'Color',[0 0 0])
    z=line(x,tan(x),'Color',[1 0 0],'Marker','x','Markersize',8);
    opt=optimset('Jacobian','on','Display','off','OutputFcn',@(x,f,s)krok(x,z));
    
    for i=1:5
        [x,~,g]=fsolve(@(x)fce(x,A),x,opt);
        line(x,tan(x),'Color',[1 0 0],'Marker','o','Markersize',8)
        line([x x],[0 tan(x)],'Color','red')
        disp([num2str(x,16) ' ' num2str(g)]);
        x=x+pi;
    end
    axis equal;
end
function [y,yd]=fce(x,a)
    y=sin(x)-a*x*cos(x);
    yd=(1-a)*cos(x)+a*x*sin(x);
end
function stop=krok(x,z)
    stop=false;
    set(z,'XData',x,'YData',tan(x));pause(1);
end

Zobrazuje reseni po kliknuti mysitka

function reseninelinrov3(A)
    ezplot(@(x)tan(x)-A*x,[0 18]);
    p=line([0 18],[0 0],'Color',[0 0 0]);
    opt=optimset('Jacobian','on','Display','off');
    set([p gca],'ButtonDownFcn',@(s,t)klik(A,opt))
    axis equal;
end
function [y,yd]=fce(x,a)
    y=sin(x)-a*x*cos(x);
    yd=(1-a)*cos(x)+a*x*sin(x);
end
function klik(A,opt)
    m=get(gca,'CurrentPoint');
    [x,~,g]=fsolve(@(x)fce(x,A),m(1,1),opt);
    line(x,tan(x)-A*x,'Color',[1 0 0],'Marker','o','Markersize',8)
    disp([num2str(x,16) ' ' num2str(g)]);
end

Reseni predavanim funkci jako parametru

a=0.2;
reseninelinrov3(@(x)tan(x)-a*x,@(x)1/cos(x)^2+a*x,21)
function reseninelinrov3(f,g,L)
    ezplot(f,[0 L]);
    p=line([0 L],[0 0],'Color',[0 0 0]);
    opt1=optimset('Jacobian','on','Display','off');
    opt2=optimset('Jacobian','off','Display','off');
    set(p,'ButtonDownFcn',@(s,t)klik1(f,g,opt1))
    set(gca,'ButtonDownFcn',@(s,t)klik2(f,opt2))
    axis equal;
end
function [y,yd]=fce(x,f,g)
    y=f(x);
    yd=g(x);
end
function klik1(f,g,opt)
    m=get(gca,'CurrentPoint');
    [x,~,g]=fsolve(@(x)fce(x,f,g),m(1,1),opt);
    line(x,f(x),'Color',[1 0 0],'Marker','o','Markersize',8)
    disp([num2str(x,16) ' ' num2str(g)]);
end
function klik2(f,opt)
    m=get(gca,'CurrentPoint');
    [x,~,g]=fsolve(f,m(1,1),opt);
    line(x,f(x),'Color',[1 0 0],'Marker','o','Markersize',8)
    disp([num2str(x,16) ' ' num2str(g)]);
end

Diferencialni rovnice

y'=f(x,y),y(0)=A, y_i+1=y_i+h f(x_i,y_i) / Euler ode - ordinary diferencial equation y'=y+x, y(0)=A=1

function obyc
    [t,y]=ode45(@(t,y)y+t,[0 4], 1);
    plot(t,y);
end
function obyc
    a=1;
    sol=ode45(@(t,y)y+t,[0 2], a);
    x=0:0.01:2;
    plot(x, deval(sol,x),'LineWidth',5);    
    line(x,(a+1)*exp(x)-x-1,'Color',[1 1 1]);
end

Vypocet vrhu.

sikmyvrh(20,30)

function sikmyvrh(v,alfa)
    g=9.81;
    vs=v*sin(alfa*pi/180);
    vc=v*cos(alfa*pi/180);
    sol=ode45(@(t,y)fce(y,g),[0 2.2],[0 0 vc vs]);
    x=0:0.01:2.2;
    h=deval(sol,x);
    plot(h(1,:),h(2,:),'LineWidth', 5)
    
    sol=ode45(@(t,y)fceo(y,g,0.02),[0 2.2],[0 0 vc vs]);
    h=deval(sol,x);
    line(h(1,:),h(2,:),'LineWidth', 1);
    
    a=vc*vs/g;
    b=0.5*vs^2/g;
    x=0:0.1:40;
    line(x,b*(1-((x-a)/a).^2),'Color',[1 1 1])
    line([0 40], [0 0], 'Color', [0 0 0]);
    
    t=fsolve(@(t)vyska(sol,t),2);
    
    disp([[t;0;vc;vs] deval(sol,t)]);
end

function v=vyska(sol,t)
    h=deval(sol,t);
    v=h(2);
end

function z=fce(y,g)
    z=[y(3);y(4);0;-g];
end

function z=fceo(y,g,c)
    vn=norm(y([3 4]));
    z=[y(3);y(4);-c*vn*y(3);-g-c*vn*y(4)];
end
function volnypad
C=1;
S=1;
m=80;
ro=1.28;
sol=ode45(@(t,y)odpor(y,C*S*ro/m),[0 12],[0 0]);

x=0:0.1:12;
y=deval(sol,x);
x=0:0.1:4;
plot(y(1,:),3.6*y(2,:));

line(0.5*9.81*x.^2,3.6*9.81*x,'Color',[1 0 0])

end

function z=odpor(y,c)
    z=[y(2);9.81-0.5*c*y(2).^2];
end

Odkazy

/home/dum8d0g/www/martin.kopta.eu/trash/wiki/data/pages/software/octave.txt · Poslední úprava: 2010/04/28 18:20 autor: pools
CC Attribution 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0