Sei sulla pagina 1di 154

Introduo ao MATLAB

1/151

Instrutor

Edilson Grnheidt Borges

CENAPAD-SP

Introduo ao ambiente Originado do FORTRAN, evoluiu em interatividade e diversidade. Muito eciente para desenvolvimento de algoritmos, anlise e visualizao de dados. Grande diversidade e facilidade na elaborao de funes reutilizveis. Acesso simples ao sistema de ajuda.
2/151

Ajuda no MATLAB O comando helpwin mostra uma janela de ajuda com os diversos Toolboxes que agrupam os comandos e funes. Os demos podem ser visualizados com o comando demo. helpdesk busca ajuda online. O comando help mostra informaes sobre os comandos, em modo texto.
3/151

Ajuda em modo texto O comando lookfor busca por palavras nos arquivos de ajuda. O comando wich mostra a localizao de outro comando na rvore de diretrios do computador. Podem ser utilizados comandos do sistema operacional. O comando bench retorna parmetros de ecincia do hardware.
4/151

Exemplos helpwin demo lookfor info debug helpdesk help which !mkdir
5/151

Variveis no MATLAB Toda varivel uma matriz. case sensitive. As variveis no so declaradas - exceto global e symbolic. Os comandos who e whos mostram listas das variveis inicializadas. O comando clear remove variveis liberando recursos do sistema.
6/151

Exemplos texto=Esta e uma frase exemplo; texto texto(24) texto(1,24) bananas = 4; laranjas = 5; frutas = laranjas + bananas; p_laranja = 2.5; p_banana = 2; p_medio=(laranja*p_laranja ... +banana*p_banana)/frutas;
7/151

Exemplos bananas who clear bananas clear p* clear all Bananas whos who who who
8/151

Manipulao algbrica Comandos de lgebra matricial tm grande compatibilidade com o clone denominado octave1. Vrias sintaxes para entrada de dados. A varivel ans contm o resultado da ltima operao executada. Facilidade para selecionar elementos.
1

9/151

Disponvel gratuitamente no endereo http://www.octave.org

Exemplos A = [ 2 1 1;1 2 1;1 1 2] A = 2 1 1 1 2 1 1 1 2


10/151

Exemplos B=[1 2 3 ... 4;5 6 7 8; 9 ... 10 11 12] B = 1 2 3 4 5 9 6 10 7 11 8 12


11/151

Exemplos C 2 1 C = [3 1 2 3 1 2 3] = 3 1 2 2 1 3 2 1 3
12/151

Exemplos ans B(:,1) C(1,2) B(:,1:3) A(2,:)=[] A(3,3)=2 twos(3,3) G=rand(3,3)


13/151

zeros(3,3) ones(3,3) eye(4) size(B)

Operaes elementares Cada operador pode ser utilizado de vrias maneiras. A utilizao dos operadores sobrecarregados resulta valores dependentes do contexto. O operador . um modicador importante. O operador : indica intervalos.
14/151

Exemplos A*C A(1,1)+1 A.*5 [A;C] MAT = A.*C A.+1 C/A 1:0.7:10 A+1 A*5 C./A B(:)
15/151

Exerccios Criar uma matriz com o nmero dois em todos os elementos. Criar uma matriz triangular superior da forma [1 2 3;0 4 5;0 0 6] Criar uma matriz triangular inferior aleatria Resolver um sistema linear em que c b = a, partindo de a e b
16/151

Solues possveis 2.*ones(3,3); 2+zeros(3) a(1,:)=1:3; a(2,2:3)=4:5; a(3,3)=6 b=rand(3,3); b(1,2:3)=0; b(2,3)=0 c=a/b : c b = a; b c = a
17/151

Exemplo Um sistema linear simples com autovalores e autovetores x = [1 2 3 4 5]; x k = x/y; z = y\x k*y y = randn(5) ; y*z 2\4
18/151

4/2

y=[1:5;6:10;11:15;16:20;21:25]

Salvando e carregando save aula; clear all; ls


19/151

load aula

save varC C; clear C; load varC save -append varC A, clear all; load varC; whos

Constantes H diversas variveis que so utilizadas pelo MATLAB. Sobrescrever estas variveis pode ocasionar resultados indesejados. Uma varivel que deve ser determinada denominada constante. O comando clear sobre esta varivel reinicializa o seu valor atribudo pelo MATLAB
20/151

Exemplos i clear i clock inf-inf pi j i 1/0 1/0-inf eps i=0 date 0/0 sin(1/inf)
21/151

Funes elementares O MATLAB tem denidas rotinas para calcular todas as operaes ditas elementares. Aplica-se uma funo sobre uma matriz da mesma forma que sobre um valor. Conceito de sobrecarga de funo. Hierarquia das operaes.
22/151

Exemplos 2^10 sin A sqrt(A) floor(pi) rem(A,C) A^2 sin(A) round(G) ceil(pi) exp(A) A.^2 abs(-pi) fix(G) sign(-pi) log10(A)
23/151

Exemplos 2+3*4 A*B -A^2 3>2*3 2^3*4 2^2^3 2.^-A


24/151

4^sin(0.5236) 3*(2+2) 3>2+3

3*1>2 (3>2)+3

Precedncia: help precedence


1. Transposio (.), Potenciao (.^), Complexo Conjugado (), Potenciao de matriz (^) 2. Negativo (-), Negativo lgico (~) 3. Multiplicao (.*), Diviso (./), Diviso esquerda (.\) 4. Aditio (+), Subtrao (-) 5. Operador dois pontos (:) 6. Menor (<), Menor ou igual (<=), Maior (>), etc... 7. Operador lgico AND (&) 8. Operador lgica OR (|)
25/151

Nmeros complexos So denidos normalmente utilizando as constantes i e j na parte complexa. Deve se tomar o cuidado de no alterar os valores destas constantes quando se trabalha com valores complexos. Aritimtica convencional. Tambm possvel utilizar a notao polar.
26/151

Exemplos c1=3-2*i; c1*c2 c2=-1/2+j; c1+c2


27/151

c1/c2 [c1 c2] [c1 c2]. imag(c1) abs(c1)

real(c1)

conj(c1)

angle(c1)

abs(c1)*exp((angle(c1)*i))

Converso entre tipos e formatos Podemos mostrar valores com maior nmero de casas decimais. Transformar nmeros em strings. O valor numrico de um caractere dado por uma tabela. Converter diferentes bases numricas.
28/151

Exemplos n=num2str(23) deg2dms(12.123) dec2hex(ans) lower(ABC) n+1 ischar(n) km2nm(12)


29/151

bin2dec(011001) upper(ans)

lookfor convert

Exerccios Crie uma matriz 3x3 com nmeros aleatrios inteiros entre 20 e 30. Como transfornar uma matriz numrica para string? Como fazer a converso entre radianos e graus? Conrme que eln i = ln(ei)
30/151

Exerccios Obtenha a reatncia do circuito dada por V RLC = V R + i(V L V C)


VR VL |VR| = 12,0V |VL| = 15,5V VRLC VC |VC| = 10,5V
31/151

Funes trigonomtricas As funes sin(x) e cos(x)xij [, +]. As funes sin(x), cos(x), tan(x) no so denidas para todos os complexos. A funo tan(x) retorna o valor da preciso numrica se x = (2n+1)/2, j que tan(x) = sin(x)/cos(x) e cos((2n+1)/2) nulo para n inteiro. As funes trigonomtricas inversas so denidas.
32/151

Exemplos2 help elfun sin1 tan1


33/151

cos1 a * sin (b( + c))+d a * tan (b( + c))+d csc cot sec

Extrados do endereo http://mathdemos.gcsu.edu

Funes hiperblicas So denidas normalmente. cosh(x) 1 (ex + ex) 2 sinh(x) 1 (ex ex) 2
sinh(x) tanh cosh(x)
34/151

limx sinh(x) = limx sinh(x) = atanh(x) x [1, 1]

Exemplos sin(1000+i) asin(1-i) sinh(i) sin(710i) sin(-711i) acos(10i) acos(711i)


35/151

acosh(10i) cos(711i)

acosh(10000000i)

Exemplos l=-pi:0.2:pi; sin(l+i)


36/151

sin(l).^2 + cos(l).^2 x=-315:5:315; y=127.7 * cosh(x/127.7) + 757.7 plot(x,y)

Funes e Scripts Funes e Scripts so procedimentos realizados atravs de seqncias de comandos escritas, geralmente, em arquivos. A principal diferena como as variveis criadas ou utilizadas dentro de funes e scripts so tratadas na rea de trabalho. Procedimentos na forma de scripts no podem ser compilados como arquivos executveis.
37/151

Escopo de uma varivel em funo A funo s v variveis so passadas como argumentos. Variveis criadas so apagadas ao m execuo se no retornam como argumentos de sada. Uma varivel pode ser declarada global. Deve ser declarada global antes da chamada da funo. Tambm deve ser declarada global no corpo da funo.
38/151

Escopo de uma varivel em script Um script v as variveis da rea de trabalho, e cria variveis na rea de trabalho. Sobrescreve variveis sem perguntar nada. Uma varivel pode ser declarada global por um script. A declarao global no script equivalente declarao na rea de trabalho.
39/151

Funes Um mtodo ou sub-rotina pode ser denido por uma funo dentro de um arquivo com extenso .m . As primeiras linhas iniciadas com o smbolo % so utilizadas para documentao. Em seguida denimos a funo. O arquivo deve estar no diretrio corrente ou em algum caminho conhecido pelo MATLAB.
40/151

Exemplo de Funo %Esta funo calcula o permetro %de uma circunferncia de raio R. %Se R uma matriz, circum(R) %retornar uma matriz contendo os %permetros das circunferncias %com os raios da matriz R function C = circum(R) C = 2*pi*R;
41/151

Um Script Deve estar escrito no arquivo arper.m: % calcula area e permetro area = pi*r^2; per = 2*pi*r; Resulta erro se no existe a varivel r na rea de trabalho. As variveis area e per cam disponveis na rea de trabalho. O script executado escrevendo no prompt arper.
42/151

Exerccios Transforme o script arper em uma funo. Escrever uma funo que calcula a rea e o volume de n cilindros determinados pelos vetores de raios, r, e de alturas, h, onde: area = 2 r h + 2 r2 volume = r2 h
43/151

Exerccios Utilize o arquivo singraph.m para criar o grco da funo sinh Modique os limites do domnio para que os dados atuais situem-se dentro da imagem prevista nos grcos. Verique as variveis criadas na rea de trabalho.
44/151

Operadores relacionais
45/151

Operador Descrio < menor do que <= menor ou igual > maior que >= maior ou igual == igual em condio/comparao ~= no igual, distinto

Parte importante de toda a programao: Comparar para tomar decises.

Exemplos a = [1 2;3 4]; a ~= b a==b b = [0 2;4 -5 ]; a>b a<b


46/151

txt1=teste; txt2=Texte; txt1==txt2; txt3=TESTE; strcmp(txt1,teste) strcmp(txt1,txt2) strcmpi(txt1,txt3)

Exemplos b==abB c=[1 2 3 4]; 2 == c 2 <= a 2>(0:4) any(d<3) find(c>2) b<=abcB aBcA<70
47/151

d=[1 2 3; 2 3 4]; d<3 any(d==2) all(c>2)

find(c<3) find(d>2)

Exemplos ex=[0 1 2]./[0 2 0] isnan(ex) ex==NaN NaN>ex


48/151

NaN>=ex isinf(ex)

NaN==NaN Inf>=ex

Inf>ex

finite(ex) isnumeric(ex)

Operadores lgicos
49/151

Operador Descrio & e | ou ~ no

& 0 1 0 0 0 1 0 1

| 0 1 0 0 1 1 1 1

~ 0 1 1 0

a=2; (a<b&b<c)

b=0; c=1; (b==c|c<a) (a~=c|b<c)

Como obter o operador ou exclusivo?

xor 0 1 0 0 1 1 1 0

Exerccios Dada a matriz: x = [3 15 9 12 -1 0 -12 9 6 1] 1. Mostre o vetor do tamanho de mesmo comprimento apenas com os valores menores que zero inicializados ([0 0 0 0 -1 0 -12 0 0 0]). 2. Um vetor em que os mltiplos de trs so substitudos pelo valor 3. 3. Multiplique os pares por 5 (rem).
50/151

4. Crie um vetor somente com os valores de x maiores que 10. 5. Um vetor como os valores de x entre zero e a mdia dos valores de x (mean(x)). 6. O vetor x com seus valores acima da mdia inicializados para sua diferena da mdia, os demais conservados.
51/151

Exerccio Crie um vetor utilizando o comando x = randperm(35) e dena uma funo por partes que satisfaa as regras seguintes, usando somente indexao lgica. y(x) = 2 se 0 < x < 6 = x 4 se 6 <= x < 20 = 36 x se 20 <= x < 35
52/151

Lao if-else-end O prompt s liberado com o comando end. a=rand; if a >= .5 disp(a >= 1/2); else disp(a < 1/2); end
53/151

Exemplo if-elseif-else-end val1 = input(Entre com val1: ); val2 = input(Entre com val2: ); if val1<val2 disp(val1 < val2); elseif val1>val2 disp(val1 > val2); else disp(val1 = val2); end
54/151

Exemplo if-else aninhados


num=input(Entre numerador); den=input(Entre denominador); if(num>=den) if(rem(num,den)==0) if(num==den) disp(num = den); else disp(So divisveis); end else disp(No so divisiveis); end else disp(den > num); end
55/151

% Exemplo if-elseif-else-end x = input (Entre com o valor da medida: ); u1 = input (Entrada (cm/in/ft): , s); u2 = input (Saida (cm/in/ft): , s); if (strcmp(u1,cm) & strcmp(u2,in)) y=0.393701*x; elseif (strcmp(u1,in) & strcmp(u2,cm)) y=2.54*x; elseif (strcmp(u1,cm) & strcmp(u2,ft)) y=0.0328084*x; elseif (strcmp(u1,ft) & strcmp(u2,cm)) y=30.84*x; elseif (strcmp(u1,in) & strcmp(u2,ft)) y=x/12; elseif (strcmp(u1,ft) & strcmp(u2,in)) y=12*x; else disp(Unidade indefinida); end

56/151

Detalhes importantes Cada bloco mutuamente exclusivo, apenas um ser executado. A ordem dos blocos na construo ifelsif-else-end importante. Se dois blocos satisfazem as condies, apenas o primeiro ser executado. Mantenha tudo o mais simples e organizado possvel, e tenha certeza que o bloco else s ser alcanado apropriadamente.
57/151

Erros possveis A comparao entre nmeros de dupla preciso pode levar a resultados equivocados. Por exemplo: sqrt(2)^2==2 deveria ser verdadeiro, e no . O problema com o arrendondamento. Comparaes so SEMPRE corretas com nmeros inteiros, porm com ponto utuante podem levar a resultados inesperados.
58/151

Exemplo switch-case
fprintf(\n\n); disp(Conversao entre unidades:); disp(centimetros, polegadas e pes); fprintf(\n); x=input(Entre valor numerico a converter: ); fprintf(\n\n); disp(Os seguintes sistemas sao validos:); disp(cm-in; in-cm; cm-ft;); disp(ft-cm; in-ft; ft-in); fprintf(\n); sistema = input(Escolha o sistema: ,s); switch sistema
59/151

case cm-in y=0.393701*x; disp([num2str(x),cm = ,num2str(y),in]); case {in-cm,IN-CM,In-Cm,iN-cM} y=2.54*x; disp([num2str(x),in = ,num2str(y),cm]); case cm-ft y=0.0328084*x; disp([num2str(x),cm = ,num2str(y), ft]); case ft-cm y=30.48*x; disp([num2str(x),ft = ,num2str(y), cm]); case in-ft y=x/12; disp([num2str(x),in = ,num2str(y),ft]); case ft-in y=12*x; disp([num2str(x),ft = ,num2str(y),in]); otherwise disp(Unidade desconhecida); end

60/151

Consideraes Para cada case o argumento capturado pelo switch comparado com todas as condies. Se nenhum caso satisfaz, ainda pode-se executar o bloco otherwise (opcional). O uso de switch-case mais apropriado quando temos condies que podem ser listadas. No mximo um bloco ser executado.
61/151

Exerccios 1. Escreva um pequeno programa que pergunte a idade e classique conforme o esquema seguinte: Erro < 0 <= Beb < 1 <= 1 Criana < 13 <= Adolescente < 18 <= Adulto < 60 <= Idoso < 120 <= Erro 1. 2. Crie uma funo para converter a temperatura Fahrenheit para Celsius e viceversa.
62/151

Exemplo while-end com critrio


EPS2 = 1; num = 1; while (1+EPS2) > 1 EPS2 = EPS2/2; num = num+1; end EPS2 = 2*EPS2; disp([EPS2 = ,num2str(EPS2)]); disp([numero de lacos= ,num2str(num)]); % EPS2+1>1 ? EPS2/2+1>1 ?
63/151

Exemplo while-end com loop innito while 1 name = input(Digite ... algo: ,s); if isempty(name) break % A fuga! end end
64/151

Exerccios 1. Escreva o programa que testa a diviso indenidamente, at que um dos valores de entrada seja nulo. 2. Escreva um pequeno programa que pergunte uma seqncia de nmeros, termine ao entrar NaN e que calcule a soma e a mdia dos valores.
num=input(Numerador); den=input(Denominador); if(num>=den), if(rem(num,den)==0) if(num==den),disp(num=den),else,disp(Divisveis),end; else,disp(No divisiveis),end;else,disp(den>num),end;
65/151

Exemplo for-end
%Contagem regressiva de tempo em segundos disp(Conta o tempo a partir de tzero); seg = input(Entre com o valor de tzero); fprintf(\n); tic;%marca o inicio do tempo cont = 0; for k=seg:-1:0, cont = cont+1; while toc < cont, end disp([Contagem regressiva: ,num2str(k)]); end
66/151

Como funciona?

Exemplo for-end com vetor vetor = [3 4 1 7 1 9 5 2]; for valor = vetor disp(valor) end O programa mostra os valores do array. O interessante notar que uma estrutura do tipo for-end no precisa assumir valores em seqncia.
67/151

Exemplo for-end com array array = [3 4 1 7; 1 9 5 2]; for v = array disp([v: ,num2str(v)]), disp([soma: , ... num2str(sum(v))]), end Este programa mostra os valores das colunas transpostas e a soma, tal qual o comando sum faria.
68/151

Lao com desvio de uxo Em perfurao de poos de petrleo temos que o Gradiente de Presso de Poros em Funo da Profundidade Pi = (i (Di Di1))/(Di) onde i e Di so valores obtidos experimentalmente.
69/151

d=[7100 7350 7500 7700 7800 ... 8200 8500 8700 9250 9750 ... 10300 11000 12000 13000]; rho=[1.4 1.55 1.64 1.70 ... 1.775 1.84 1.89 1.94 ... 2.0 2.1 2.2 2.2 NaN 2.28]; [a,b]=size(d); for i=1:b, if i==1, di=0; elseif (~(rho(i)==rho(i))), rho(i) = (rho(i-1)+rho(i+1))/2; else, di = d(i-1); end; dp(i)=rho(i)*di/d(i); end;

70/151

Exerccio O programa apresentado tem erro de lgica. Encontre. H problemas no tratamento dos dados de entrada. Como corrigir? possvel organizar programas completamente seguros quanto aos erros nos dados de entrada?
71/151

if isnan(ro(1)),ro(1)=... ro(2)-(ro(3)-ro(2));end; if isnan(ro(b)),ro(b)=... ro(b-1)+(ro(b-1)-ro(b-2));end; t=find(isnam(ro)); ro(t)=(ro(t+1)+ro(t-1))/2; for i=1:b, if i==1, di=0; else, di = d(i-1); end; dp(i)=ro(i)*di/d(i); end;

72/151

Exerccio Escreva uma funo que ordene um vetor de nmeros em ordem crescente. Um dado elemento colocado na sua posio aps os elementos seguintes terem sido deslocados. Comparar e substituir sucessivamente par de elementos consecutivos at que todos estejam em ordem.
73/151

Operaes sobre matrizes A=rand(3) diag(A) A det(A) inv(A)


74/151

C=[1 2 3]

C=diag(C) sin B

B=randn(3,4) rank(B) expm(A)

cov(A)

pascal(5) logm(ans)

cond(A) sqrtm(A)

Operaes sobre vetores e matrizes v1=[0 4 5] v2=[6 7 8] dot(v1,v2) cross(v1,v2) norm(v1) norm(A) any(v1) all(v1) length(v1)
75/151

linspace(1,10,5) logspace(1,10,5) randperm(9) sum(A) sum(A,2)

Um problema prtico Um estudo de ortopedia digitaliza o movimento pelo mapeamento tridimensional de sete sensores acoplados ao corpo de um indivduo. A cada medida gerada uma linha de dados que contm uma string de vinte e um nmeros, as coordenadas cartesianas de cada sensor. Precisa-se do ngulo entre cada trade consecutiva de sensores.
76/151

Clculo do ngulo entre vetores load dd.txt -ascii; [a,b]=size(dd); for c = 1:a,for d = 1:3:b-5, v1=[dd(c,d:d+2)]; v2=[dd(c,d+3:d+5)];e=ceil(d/3); t=dot(v1,v2)/(norm(v1)*norm(v2)); ang(c,e)=rad2deg(acos(t)); end;end;
77/151

Operaes com vetores e matrizes [A;C]*C sin(A)^2 H=1:0.8:10 [A C] A.\C ([A;C]*C) B*A H*H A/C A\C A.^2 B^2 H*H A./C
78/151

Manipulao de matrizes cat(A,A,3) fliplr(A) flipud(B)


79/151

triu(B) tril(B) triu(B,3) rot90(A) C=reshape(B,3,2,2) size(C) size(ans) flipdim(C,3)

permute(C,[3 1 2]) [b,n]=shiftdim(C,2)

Como vetorizar o problema dos vetores A utilizao do lao for-end no boa para a performance. Desejamos criar um script que realize o clculo de ngulo entre os vetores na forma vetorial, sem nenhum tipo de lao explcito. Dica: Use os comandos reshape e permute para ordenar a matriz num formato mais conveniente (3x21xN, p.ex.).
80/151

Estatstica e estruturas de dados


for i=(1:4), nota(i).curso=[mat;sci;por;ing;his;geo] nota(i).turma=rand(13,6).*100; nota(i).media = mean(nota(i).turma); [nota(i).minima.nota,nota(i).minima.aluno] ... = min(nota(i).turma); [nota(i).ordem.nota,nota(i).ordem.aluno] ... = sort(nota(i).turma); [nota(i).maxima.nota,nota(i).maxima.aluno] ... = max(nota(i).turma); nota(i).desvio = std(nota(i).turma); figure(i),hist(nota(i).turma,5); [nota(i).num,nota(i).inter] = hist(nota(i).turma); nota(i).auto=autosc(nota(i).turma); end;
81/151

Estruturas no MATLAB Muitas informaes relevantes sobre a maneira de mostrar os dados, congurar as janelas e os parmetros utilizados em algortimos so armazenados em estruturas de dados denominadas handles. txt=text(1,2,nada), pos=get(txt,Position), set(txt,Position,[0.5 0.5]) set(txt,FontSize,20)
82/151

Clulas de arrays So muito semalhanteas s estruturas de dados. A{1,1} = [1 4 3; 0 5 8; 7 2 9]; A{1,2} = Edilson Borges; A{2,1} = 3+7i; A{2,2} = -pi:pi/10:pi; cellplot(A); A{1,1}(1), B={[1 2] T 3+4i;[1;4] -5 abc}
83/151

Converso C=struct2cell(nota);cellplot(C), C{4,1,1}, C{4,1,1}.nota,


84/151

C{4,1,1}.nota(1),reshape(C,5,2,4), cp={n1,n2}; d=cell2struct(A,cp,2);

Propagao de vibrao atravs do solo Uma maneira para determinar a composio do solo analisar a propagao de vibraes.
Offset: x

85/151

dti =
Velocidade: v Profundidade: z

Virms Ti =

zi zi1 vi vi2 dti = dti dti2 + x2 Virms

Grcos: Cores e eixos x = linspace(-pi,pi,30); y=sin(x); plot(x,y,-); z = cos(x); t = tan(x); plot(x,y,b:p,x,z, ... c-,x,z,m+,x,t,bo-); set(gcf,Color,[1 1 0.8]); set(gca,Color,[1 1 0.7]); axis([-pi pi -2 2]);
86/151

Fontes e smbolos
grid; title(Funes Trigonometricas,... FontSize,14,Fontweight,Bold); xlabel(Angulo \theta,FontSize,14,... Fontweight,Bold,FontAngle,... normal); legend(sin(\theta),cos(\theta),... tan(\theta)) ylabel(Imagem,FontSize,14,... Fontweight,Bold,... FontAngle,italic); text(1.4661,9.5144,... \rightarrow Max. tan(\theta)) grid off;
87/151

Marcaes nos eixos x = -pi:0.02*pi:pi; y = sin(x); z = cos(x); plot(x,y); hold on; plot(x,z); plot(x,y,x,z); set(gca,YTick,[-2 0 .2 .6 1 2]) set(gca,XTick,[-pi:0.5:pi]) set(gca,XTicklabel,... a|B|c|D|e|F); grid;
88/151

Mais sobre grcos [z,y,z]=ginput(3) gtext({um,dois}) clf pts1=text(0,0,[x(1),x(1)]); delete(pts1) close t=-pi:0.1:pi;y=sin(t);z=tan(t); plotyy(t,y,t,z)
89/151

Grcos mltiplos
x = linspace(0,2*pi,30); y = sin(x); z = cos(x); a = 2*sin(x).*cos(x); b = sin(x)./(cos(x)+eps); subplot(2,2,1); plot(x,y); axis([0 2*pi -1 1]); title(sin(x)); ylabel (Imagem); subplot(2,2,2); plot(x,z); axis([0 2*pi -1 1]); title(cos(x)); subplot(2,2,3); ylabel (Imagem); plot(x,a); axis([0 2*pi -1 1]); title(2 sin(x) cos(x)); subplot(2,2,4); plot(x,b); axis([0 2*pi -20 20]); title(sin(x)/cos(x));
90/151

Modicando as escalas
x=linspace(0,pi,30); subplot(2,2,1); plot(x,y); axis([0 pi 0 1]); title (Escala decimal em X e Y) subplot(2,2,2); semilogx(x,y); title (Escala decimal em Y e log em X); subplot(2,2,3); semilogy(x,y); axis([0 pi 0.01 1]); title (Escala decimal em X e log em Y); subplot(2,2,4); loglog(x,y); axis([0.1 pi 0.01 1]); title (Escala log em X e Y);
91/151

Um grco animado
t=0:pi/180:2*pi; kk=length(t); sint=sin(t); cost=cos(t); hfig=figure(units,normal,position,[0 0 1 1],... color,white); axis(off) titlebox=subplot(position,[.3 .5 .1 .05]); axis(off) text(0,0,GENERATING the SINE GRAPH,fontweight,... bold,fontsize,14,color,magenta) grbox=subplot(position,[.1 .1 .3 .3]); axis([-2 2 -2 2]),axis(axis); hold on, gca; plot(xlim,[0 0],-k,[0 0],ylim,... -k,linewidth,2); hold off hold on, gca; plot(xlim,[0 0],-k,[0 0],ylim,... -k,linewidth,2); hold off grid on; axis(square);axis(off); hold on name1=subplot(position,[.1 .4 .1 .05]); axis(off) text(.5,0,UNIT CIRCLE,fontweight,bold,color,red) name2=subplot(position,[.45 .4 .1 .05]); axis(off)
92/151

text(0,0,Angle in radians vs. length of blue segment.... ,color,blue,fontweight,bold) deglabel=subplot(position,[.2 .05 .1 .05]); axis(off) ptslabel=subplot(position,[.5 .05 .1 .05]); axis(off) graph=subplot(position, [.4 .1 .3 .3]); axis([0 2*pi -2 2]),axis(axis); hold on,gca;plot(xlim,[0 0],-k,[0 0],ylim,-k,... linewidth,2); hold off hold on,gca;plot(xlim,[0 0],-k,[0 0],ylim,-k,... linewidth,2); hold off grid on;axis(off); hold on; pause(2) for jj=1:kk subplot(grbox) plot(cost(jj),sint(jj),.r,erasemode,none) radius=plot([0 cost(jj)],[0 sint(jj)],-k,linewidth,2); ht=plot([cost(jj) cost(jj)],[0 sint(jj)],-b,... linewidth,2); deg=num2str(jj-1); subplot(deglabel) deg1=text(0,0,[deg degrees],fontweight,bold); subplot(graph) plot(t(jj),sint(jj),.b,erasemode,none) subplot(ptslabel) pts1=text(0,0,[( num2str(t(jj)) , num2str(sint(jj))... )],fontweight,bold); pause(.1), delete(deg1,pts1,radius,ht); end

93/151

subplot(ptslabel) text(0,0,y = sin(x) entre [0, 2pi].... ,fontsize,14,color,blue,... fontweight,bold); vty=subplot(position,[.1 .05 .1 .05]); axis(off); van=text(0,0, D.R.Hill,... unit,normal,color,black,... fontsize,12,fontweight,bold,... fontangle,oblique,erasemode,none); drawnow

94/151

Como o comando subplot foi usado? Para que atribuir handlers para textos impressos em grcos? Crie um grco que ligue pontos com linhas e anime o movimento.

Grcos em tortas
subplot(2,2,1); a = [0.5 1 1.5 2.0 1 0.3]; pie(a,a==max(a)); title(Produo de gros); legend(Arroz,Feijo,Soja,Trigo,... Milho,Cevada); subplot(2,2,2); destaque = [0 1 0 1 0 1]; pie3(a,destaque); colormap hsv; subplot(2,2,3); title(Grafico em barras); b = [1960 1970 1980 1990 2000 2001]; barh(b,a); ylabel(Safra) xlabel(Producao de graos) subplot(2,2,4); stairs(b,a); xlabel(Safra); ylabel( Producao de graos ); title(Grafico em escada);
95/151

Grcos de rea
tetha=0:2*pi/100:2*pi r=sin(2*tetha).*cos(2*tetha); subplot(1,2,1); xlabel( Abscissa X ); ylabel( Ordenada Y ); title (Grafico de area); area(theta,r); subplot(1,2,2) polar(tetha,r) title (Rosacea de 8 petalas);
96/151

Grcos tridimensionais t = linspace(0,10*pi,200); plot3(sin(t),cos(t),t); title(H e l i c e ); xlabel(X = Sin(t)); ylabel(Y = cos(t)); zlabel(Z = t);
97/151

Grcos tridimensionais coloridos x = -7.5:0.5:7.5; y = -7.5:0.5:7.5; [X,Y] = meshgrid(x,y); R = sqrt(X.^ 2+Y.^ 2)+eps; Z = sin(R)./R+1; mesh(X,Y,Z); hold on; pcolor(X,Y,Z);shading interp; contour(X,Y,Z,4,k);colorbar; hold off;
98/151

Desenhando uma equao Em cintica qumica necessrio calcular valores de Vi em uma reao, onde 1 Vi = Vmax 1 . Os valores de
1+ks+ k
99/151

Vmax = 0, 5, ks 15 e ki 18 foram obtidos experimentalmente para uma dada reao. Obtenha um grco de Vi em funo de ks e ki . Obtenha o grco para diferentes valores de Vmax.

Um problema de Engenharia de Petrleo Partindo de uma gura que obtida com dados de perfurao deseja-se obter um perl tridimensional do reservatrio.
100/151

load porosidade.mat; y=linspace(0,22500,226); x=linspace(0,8000,81); z=linspace(0,250,51); [xx,yy,zz]=meshgrid(x,y,z); p = patch(isosurface ... (xx,yy,zz,porosidade,25)); set(p,FaceColor,red,Edge... Color,None,FaceAlpha,.3); axis tight; box on; camva(10); campos([-200 -200 -200]);

101/151

102/151

Dados climticos
load wind; div = divergence(x,y,z,u,v,w); p= slice(x,y,z,div,[134.29],[59.99],[0]); shading interp; set(p,FaceAlpha,.8); h=streamslice(x,y,z,u,v,w,[],[],[1 7 15], .2); set(h,color,cyan); hold on; [xi yi zi ui vi wi] = subvolume(x,y,z,u,v,w, ... [95 120 nan 30 1 7]); streamslice(xi,yi,zi,ui,vi,wi,[],[],[2 4 6],.3); h = streamtube(xi,yi,zi,ui,vi,wi,110,22,6); set(h,FaceColor, red, EdgeColor, none); spd = sqrt(ui.*ui + vi.*vi + wi.*wi); [f verts] = reducepatch(isosurface ... (xi,yi,zi,spd,7), .3); h=coneplot(xi,yi,zi,ui,vi,wi, ... verts(:,1),verts(:,2),verts(:,3),2);
103/151

set(h,FaceColor,green,EdgeColor, ... none,FaceAlpha,.7); q=quiver3(xi,yi,zi,ui,vi,wi); set(q,color,cyan); vel = sqrt(u.*u + v.*v + w.*w); p = patch(isosurface(x,y,z,vel,45)); set(p,FaceColor,red,EdgeColor,none,... FaceAlpha,.2); [f verts]=reducepatch(isosurface(x,y,z,vel,30),.2); h=coneplot(x,y,z,u,v,w,verts(:,1),verts(:,2), ... verts(:,3),2); set(h,FaceColor,blue,EdgeColor,none, ... FaceAlpha,.5); axis tight; box on; lighting phong; camlight;

104/151

105/151

Animao 2D x = -pi/2:.1:pi/2; for c=1:20 y = sin(2*x+c*pi/10); plot(x,y,LineWidth,18); axis([-pi/2 pi/2 -1 1]); M(c) = getframe; end; movie(M,20,10);
106/151

Animao 3D x = -pi/2:.1:pi/2; y = -pi/2:.1:pi/2; [X,Y] = meshgrid(x,y); for c = 1:20, Z = sin(2*X+c*pi/10)... + 1.5*cos(2*Y+c*pi/10); surf(X,Y,Z); M(c) = getframe; end; movie(M,20);
107/151

Animao load dd.txt -ascii;[a,b]=size(dd); mov=avifile(dd.avi); for c = 1:a, for d = 1:3:b, plot3(dd(c,d),dd(c,d+1), ... dd(c,d+2),o) hold on;end;M(c) = getframe; mov = addframe(mov,M(c)); hold off; end;mov = close(mov); movie(M,20);
108/151

Decomposio LU a = rand(6); cond(a); det(a); b = [1:6]; c = inv(a); d = a^-1; e = a\b; a*e; [l,u,p] = lu(a) % l*u=p*a
109/151

Mtodo do gradiente conjugado pr-condicionado size=10;A=rand(size);tol=1.e-03; for i=1:size, b(i,1) = 1; for j=i:size, A(j,i) = A(i,j); if j == i, A(i,i) = 100*A(i,i); end; end; end; %ou A=100*abs(cov(randn(size))) [x,fl,rs,it] = pcg(A,b,tol,size);

110/151

Mtodo de minimizao de resduos sz = 10; A=rand(sz); tol = 1.e-04; for i=1:sz, b(i,1) = 1; for j=i:sz, A(j,i) = A(i,j); end; end; x=zeros(sz,1); [x,fl,rs,it]=minres(A,b,tol,sz);
111/151

Matrizes esparsas size = 20; s = rand(size); for i=1:size for j=1:size if j >i s(i,j) = s(j,i); end; if s(i,j) < 0.6 & abs(i-j) > 4 s(i,j) = 0.0; end; end; spy(s,*r);
112/151

Interpolao discreta no plano


dados1=[ 0 0;1 20;2 60;3 68;4 77;5 110]; disp(Interpola em x=2.6 e x=4.9); y1 = interp1(dados1(:,1),dados1(:,2),2.6) y2 = interp1(dados1(:,1),dados1(:,2),4.9) xi=0:.01:5; hold on; yi = interp1(dados1(:,1),dados1(:,2),xi); plot(dados1(:,1), dados1(:,2),o,xi,yi,r); yj = interp1(dados1(:,1),dados1(:,2),xi,nearest); yk = interp1(dados1(:,1),dados1(:,2),xi,cubic); plot(xi,yj,b); plot(xi,yk,g); yl = interp1(dados1(:,1),dados1(:,2),xi,spline); ym = interp1(dados1(:,1),dados1(:,2),xi,pchip); plot(xi,yl,m); plot(xi,ym,c); yn = interp1(dados1(:,1),dados1(:,2),xi,v5cubic); plot(xi,yn,y);
113/151

Interpolao supercial
velocidade=[2000,3000,4000,5000,6000]; tempo=[0 1 2 3 4 5]; temperatura = [0,0,0,0,0;20,110,176,190,240;... 60,180,220,285,327;68,240,349,380,428;77,310,... 450,510,620;110,405,503,623,785]; temp=interp2(velocidade,tempo,temperatura,3800,3.1) vel=2000:100:6000; hold off; t=0:0.125:5; [X,Y] = meshgrid(vel,t); Zi = interp2(velocidade,tempo,temperatura,X,Y); mesh(X,Y,Zi); xlabel(Temperatura); ylabel(Velocidade); zlabel(Tempo); Zj = interp2(velocidade,tempo,temperatura,X,Y,... cubic);
114/151

Interpolao supercial
mesh(X,Y,Zj); xlabel(Temperatura); ylabel(Velocidade); zlabel(Tempo); Zk = interp2(velocidade,tempo,temperatura,X,Y,... spline); mesh(X,Y,Zk); xlabel(Temperatura); ylabel(Velocidade); zlabel(Tempo); Zl = interp2(velocidade,tempo,temperatura,X,Y,... nearest); mesh(X,Y,Zl); xlabel(Temperatura); ylabel(Velocidade); zlabel(Tempo);
115/151

Interpolao de volumes Supomos que haja uma regio de perfurao que corresponda aos seis pers mostrados. Queremos obter uma regio contnua que corresponda aos volumes de cada camada geolgica.
116/151

50 100 150 200 250 300 200 400 600

50 100 150 200 250 300 200 400 600

50 100 150 200 250 300 200 400 600

117/151

50 100 150 200 250 300 200 400 600

50 100 150 200 250 300 200 400 600

50 100 150 200 250 300 200 400 600

Lendo os arquivos a=slice;c=.bmp; for i=1:5, subplot(2,3,i); b=num2str(i); d=[a b c]; m=(imread(d,bmp)); imagesc(m); colormap(gray); mod(:,:,i) = double(m(:,:,3)); mod(:,:,i) = mod(:,:,i)/ ... (max(max(mod(:,:,i)))); end; clear m;

118/151

Calculando os valores interpolados xi=0:3:322;yi=0:6:714;zi=0:0.1:5; [XI,YI,ZI] = meshgrid(xi,yi,zi); por = zeros(size(mod)); por = por + 18.75 * (mod<0.1); por = por + 25.0 * ... (mod<0.48) .* (mod>=0.44); por = por + 28.78 * ... (mod<0.75) .* (mod>=0.71); por = por + 5.66 * (mod>=0.9); por_i = interp3(por,XI,YI,ZI);

119/151

Criando o grco 3D
figure(2); camlight; lighting(phong); p = patch(isosurface(XI,YI,ZI, ... por_i,5.66)); set(p,FaceColor,yellow,EdgeColor... ,None,FaceAlpha,.3); p = patch(isosurface(XI,YI,ZI, ... por_i,18.75)); set(p,FaceColor,green,EdgeColor ... ,None,FaceAlpha,.3); p = patch(isosurface(XI,YI,ZI, ... por_i,25)); set(p,FaceColor,cyan,EdgeColor ... ,None,FaceAlpha,.7); p = patch(isosurface(XI,YI,ZI, ... por_i,28)); set(p,FaceColor,blue,EdgeColor ... ,None,FaceAlpha,.7);material(metal);

120/151

Interpolao com polinmios de grau n


x = [0 1 2 3 4 5]; y = [0 20 60 68 77 110]; grau = 1; coef = polyfit(x,y,grau); hold off; ybest = polyval(coef,x); axis([-1,6,-20,120]); plot(x,ybest,x,y,o); title(Ajuste polinomial); xlabel(X); ylabel(Y); grid; hold on grau = 2; coef = polyfit(x,y,grau); ybest = polyval(coef,x); axis([-1,6,-20,120]); plot(x,ybest,r); grau = 3; coef = polyfit(x,y,grau); ybest = polyval(coef,x); axis([-1,6,-20,120]); plot(x,ybest,g); grau = 6; coef = polyfit(x,y,grau); ybest = polyval(coef,x); axis([-1,6,-20,120]); plot(x,ybest,b);
121/151

Leitura de arquivos de dados fid = fopen(cichex.xyz,r); nval = fscanf(fid,%d,1); for k=1:nval atom(k) = fscanf(fid,%2s,1); vet(k,:)=(fscanf(fid,%13f,3)); end; fclose(fid); disp( F I M )
122/151

Leitura de arquivos de dados fid = fopen(dados.txt,r); vet = fscanf(fid,%7f,inf) frewind(fid); vet = fscanf(fid,%7f,[3,inf]) fclose(fid); disp( F I M )
123/151

Escrita de arquivos de dados arqui = input(Entre nome ,s); ordem = 8; mat = randn(ordem); fid = fopen(arqui,w); for k = 1 : ordem, for l = 1 : ordem, fprintf(fid,%3.2f\t,mat(k,l)); end; fprintf(fid,\n); end; fclose(fid); disp(F I M); who
124/151

Exibio de dados
125/151

Tabela 1: Formatadores numricos utilizados na exibio de variveis no MATLAB Especicador Descrio n nmero de dgitos decimais m preciso decimal e, E formato exponencial f ponto xo d inteiros c caractere simples s palavras (string)

Exibio de dados
126/151

Tabela 2: Formatadores utilizados na exibio de dados no MATLAB Caractere Descrio \b retrocesso (do cursor) \f alimentao do formulrio \n linha nova \r retorno ao inicio da linha de impresso \t espao horizontal \\ barra invertida

Anlise polinomial
f = [3,-0.5,0,1,-5.2]; x = [-10:10]; y = polyval(f,x); subplot(2,2,1); title(f(x)=3x^4-x^3/2+x-5,2) g = [1 0 -3 -1 2.4]; m = conv(f,g); plot(x,y); y2 = polyval(g,x); subplot(2,2,2); plot(x,y2); title(f(x)=x^4-3x^2-x+2,4); rtf = roots(f); subplot(2,2,3); y3 = polyval(m,x); plot(x,y3); [q,r] = deconv(f,g); df = polyder(f); yf = polyval(f,x); ydf = polyval(df,x); subplot(2,2,4); plot(x,yf,x,ydf); polyint(f,3);
127/151

Anlise numrica de funes


f = 2*exp(-x).*sin(x); fplot(f,[0 8]); text(2,0.4,\leftarrow Funo f); hold on; f2 = -2*exp(-x).*sin(x); fplot(f2,[0 8],k-); xmin = fminbnd(f,2,5); xmax = fminbnd(f2,0,3); title(Grafico das funcoes f e -f); text(0.7854,0.6448,\leftarrow Maximo de f) text(0.7854,-0.6448,\leftarrow Minimo de -f) text(3.9270,-0.0279,\leftarrow Minimo de f) text(3.9270,0.0279,\leftarrow Maximo de -f) xlabel(x); ylabel(f(x));
128/151

Anlise numrica de funes % Para o arquivo func2.m function y=func2(x) y = 2*exp(-x).*sin(x); % No prompt fplot(func2,[0 8]); xmin = fmin(func2,0,8); xzero = fzero(func2,3.1);
129/151

Integral syms x x1 alpha u t; int(1/(1+x^2)) int(sin(alpha*u),alpha) int(x1*log(1+x1),0,1) int(4*x*t,x,2,sin(t)) int([exp(t),exp(alpha*t)]) A = [cos(x*t),sin(x*t); ... -sin(x*t),cos(x*t)]; int(A,t)
130/151

Integrao numrica Simpsom %arquivo func.m function f = func(x) f = x.^ 2; %no prompt a = 0; b = 1; quad(x.*x,0,1); quad(func,a,b); quad(@func,a,b); quad(@func,a,b,1.e-14);
131/151

Integrao numrica Lobatto f = x.*y; dblquad(f,0,1,0,1) dblquad(inline(x.*y),0,1,0,1); %no arquivo func4.m function f = func4(x) f = x.*y dblquad(@func4,0,1,0,1);
132/151

Funo denida por partes % arquivo funcpp.m function f = funcpp(x) if x >= 0 & x <= 1 f = x; elseif x >= 1 f = -0.2 * x.^3 + 1.2; elseif x <= 0 f = -sin(x); end
133/151

Integrando a funo por partes disp(Integra funcpp.m); disp(no intervalo [-pi,2]); q1 = quad(@funcpp,-pi,0); q2 = quad(@funcpp,0,1); q3 = quad(@funcpp,1,2); q = q1+q2+q3; disp([Integral=,num2str(q)]);
134/151

Diferenciao syms x; df = diff(x^ 2,x) diff(cos(a*x),x) clear all syms a; h = cos(a*x); dfa = diff(h,a)
135/151

Derivada numrica x = linspace(-1,1,30); f = x.^5 - 3 * x.^4 - 11 * ... x.^3 + 27 * x.^2 + 10 * x - 24; dfa = 5*x.^4 - 12*x.^3 - ... 33*x.^2 + 54*x + 10; df = diff(f)./diff(x); xd = x(2:length(x)); plot(x,f,r-,xd,df,b:... ,x,dfa,k-.)
136/151

Equaes diferenciais ordinrias Uma equao diferencial de primeira ordem: g1(x, y) x [2, 4] y = Inicial: y(2) = Analtica: y = 3x2 0, 5 x3 7, 5
137/151

A soluo no MATLAB % no arquivo dy.m function dy = g1(x,y) dy = 3 * x .^ 2 % No prompt. [x,ny]=ode23(dy,[2,4],0.5); ay = x.^3 - 7.5; plot(x,ny,r+,x,ay,b:); grid; sumsqr(ay-ny)
138/151

Equaes diferenciais ordinrias


139/151

g2(x, y) y [0, 2] y = 2 cos2(y) Inicial: y(0) = /4 Analtica: y = arctan(x2 + 1)

A soluo no MATLAB %No arquivo g2.m function g2 = g(x,y) g2 = 2 * x .* (cos(y)) .^ 2 % No prompt [x,ny]=ode45(g2,[0,2],pi/4); ay = atan(x.*x+1); plot(x,ny,r+,x,ay,b:); grid; sumsqr(ay-ny)
140/151

Elementos nitos unidimensionais Ntel=input(Num. El. Fin.: ); Nfbl=input(Lagr(2) Quadr(3)); % Pontos e pesos t = [-sqrt(3/5) 0 sqrt(3/5)]; w = (1/9)*[5 8 5]; % Discretizacao do dominio x = 0:(1/Ntel):1; n = (Nfbl-1)*Ntel+1;
141/151

% Programa principal [M]=incid(Nfbl,Ntel); [b]=carga(n,Ntel,Nfbl,x,t,w,M); [a]=localrig(Nfbl,t,w); [A]=rigidez(n,Ntel,Nfbl,x,M,a); B=sparse(A); [y]=solvchol(n,B,b);

142/151

% Grafico de comparacao f = zeros(n,1); x = 0:1/(n-1):1; for i = 1:n f(i)=exp(-2.0*x(i))*... sin(2.0*pi*x(i)); end subplot(1,2,1),plot(x,f,x,y) subplot(1,2,2),plot(x,f-y)

143/151

Um FrontEnd para aplicativo Controle grco para dados de entrada da simulao do funcionamento de uma enxada rotativa.
144/151

function modelgui(action); if ~ nargin, action = initiate; end


145/151

if strcmp(action,initiate) bgc = BackgroundColor; bgc2 = [0.8 0.8 0.8]; bgc1 = [0.6 0.6 0.1]; s1 = [modelgui(]; post = Position; RPM=400; fig00 = figure(Color,[0 0 0],Numbertitle, ... Off,Name,Entrada de dados,post, ... [11 19 480 320],Resize,Off); handl(2,2) = uicontrol(fig00,Style,Edit, ... post,[15 135 212 102],String, ... Rotacoes por minuto,bgc,bgc1,Userdata,[RPM]); handl(4,2) = uicontrol(fig00,Style,Slider, ... bgc,bgc2,post,[45 210 145 10],Min,RPM-100, ... Max,RPM+100,Value,RPM, ... Callback,[s1,act42);]);

handl(5,2) = uicontrol(fig00,Style,Text,bgc,... bgc1,post,[190 208 30 14],Horiz,Right,... String,num2str(get(handl(4,2),Value))); frame4 = uicontrol(fig00,Style,Frame,post,... [11 251 460 60], bgc,bgc2); handl(3,4) = uicontrol(fig00,Style,Push,... post,[60 260 105 28],String,Cria Funcoes,... Callback,[s1,act34);]); else if strcmp(action,act212) disp (Terminando :)); close elseif strcmp(action,act34),dinamica1GL; elseif strcmp(action,act42), NR = round(get(handl(4,2),Value)); end; end;
146/151

O mdulo GUI Vamos criar uma interface capaz de ler dois nmeros e mostrar o resultado da sua soma. Iniciaremos o mdulo GUI atravs do comando guide. Um layout possvel para a interface mostrado a seguir:
147/151

O mdulo Simulink Trata-se de uma interface para auxiliar no desenvolvimento de grandes projetos. No torna mais simples montar um pequeno programa, ainda que possibilite uma visualizao semelhante a um uxograma.
148/151

A S-function So as funes escritas pelo usurio para realizar operaes quaisquer que no estejam disponveis nos diversos mdulos de operaes existentes. Tm uma estrutura especial, que possibilita tratar os vrios casos do uxo de dados, e as ags manipuladas pelo Simulink. A seguir veremos como estruturada uma S-function
149/151

Inicializao
function [sys,x0,str,ts] = myfunc(t,x,u,flag) switch flag, case 0 [sys,x0,str,ts]=mdlInitializeSizes; case 3 sys=mdlOutputs(t,x,u); case { 1, 2, 4, 9 } sys=[]; otherwise error([Unhandled flag = ,num2str(flag)]); end
150/151

A funo mdlInitializeSize
function [sys,x0,str,ts] = mdlInitializeSizes() sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = -1; % dynamically sized sizes.NumInputs = -1; % dynamically sized sizes.DirFeedthrough = 1; % has direct feedthrough sizes.NumSampleTimes = 1; sys = simsizes(sizes); str = []; x0 = []; ts = [-1 0]; % inherited sample time
151/151

A funo mdlOutputs Esta a parte em que se devemos introduzir o procedimento que ser realizado. O Simulink passa os prmetros t, x e u e flags automaticamente para a S-function. function sys = mdlOutputs(t,x,u) sys = (2 * u) + (10 * cos(t/10));
152/151

A compilao de programas Algumas partes de um programa podem ser consideradas como gargalos. O MATLAB eciente para realizar as que fazem parte do kernel, mas a utilizao dos arquivos de comandos interpretados no apresenta a mesma performance. Se um procedimento extenso, pode ser programado em C ou FORTRAN e compilado como uma funo builtin.
153/151

O compilador MEX
154/151

Potrebbero piacerti anche