diff --git a/MNOL-MATLAB/README.md b/MNOL-MATLAB/README.md new file mode 100644 index 0000000..6d07ccf --- /dev/null +++ b/MNOL-MATLAB/README.md @@ -0,0 +1,12 @@ +# MNOL - MATLAB +Nesta secção vamos explorar a parte de MATLAB lecionada em MNOL. + +# Índice + +* [Introdução ao MATLAB](introducao.md) +* [Resolver equações e sistemas de equações](equacoes.md) +* [Estimar valores](estimar_valores.md) +* [Valor do Integral](integral.md) +* [Mínimos Quadrados](minimos_quadrados.md) +* [Quasi-Newton](quasi-newton.md) +* [Método de Nelder-Mead](nelder-mead.md) diff --git a/MNOL-MATLAB/equacoes.md b/MNOL-MATLAB/equacoes.md new file mode 100644 index 0000000..87ec900 --- /dev/null +++ b/MNOL-MATLAB/equacoes.md @@ -0,0 +1,22 @@ +# Resolver sistemas de equações +* definir a função +* utilizar o comando **fsolve** +```Matlab +op = optimset('tolfun',TolFun_Value,'tolx',TolX_Value); +x1 = Aproximação_inicial; +format long; +[x,fval,exitflag, output] = fsolve('fun2', x1, op) +``` +NOTA: tolx é o critério de paragem + +- - - - + +# Resolver equação +* definir a função +* utilizar o comando **fsolve** +```Matlab +op = optimset('tolx',TolX_Value); +x1 = Aproximação_inicial; +format long; +[x,fval,exitflag, output] = fsolve('fun2', x1, op) +``` diff --git a/MNOL-MATLAB/estimar_valores.md b/MNOL-MATLAB/estimar_valores.md new file mode 100644 index 0000000..c515ad3 --- /dev/null +++ b/MNOL-MATLAB/estimar_valores.md @@ -0,0 +1,39 @@ +# Estimar valores +## Polinómio Interpolador de Newton +* obter os grau + 1 pontos em torno do ponto x (por proximidade) +* calcular o polinómio interpolador +```Matlab +pol = polyfit(points_X, points_Y, grau); +``` +* calcular um ponto nesse polinómio +```Matlab +format long; +polyval(pol, point_X) +``` + +## Spline +### Spline Cúbica +```Matlab +sp = spline(points_X, points_Y, x) +``` + +### Spline Cúbica Completa +```Matlab +sp = spline(points_X, [declive_inferior points_Y declive_superior], x) +``` + +NOTAS(apenas utilizar se for explicitado que é necessário): +* se tiver função e não tiver declives + * derivar função + * calcular declive para pontos +* se não tiver função nem declives + * calcular declive dos primeiros dois e últimos dois + * remover o segundo ponto e último ponto dos vetores + +### Segmento de Spline +```Matlab +sp = spline(points_X, points_Y) +% OU +sp = spline(points_X, [declive_inferior points_Y declive_superior]) +sp.coefs +``` diff --git a/MNOL-MATLAB/integral.md b/MNOL-MATLAB/integral.md new file mode 100644 index 0000000..26369e6 --- /dev/null +++ b/MNOL-MATLAB/integral.md @@ -0,0 +1,25 @@ +# Mínimos Quadrados +## Polinómios Ortogonais +```matlab +x = [1.5 2 3 4] +y = [4.9 3.3 2 1.5] + +[p,s] = polyfit(x,y,1) + +polyval(p,2.5) + +%Residuo do erro +(s.normr)^2 +``` + +## Modelo não polinomial linear +```matlab +x = [1.5 2 3 4] +y = [4.9 3.3 2 1.5] + +foo = @(c,x) c(1)./x + c(2).*x +[c,resnorm,residual,exitflag,out] = lsqcurvefit(foo,[1 1],x,y) + +%Residuo do erro +resnorm +``` diff --git a/MNOL-MATLAB/introducao.md b/MNOL-MATLAB/introducao.md new file mode 100644 index 0000000..1081c22 --- /dev/null +++ b/MNOL-MATLAB/introducao.md @@ -0,0 +1,122 @@ +# Introdução + +## Variáveis +MATLAB e dinamicamente tipado o que significa que não se indica qual e o tipo da +variável. Desta forma, para declarar uma variável utiliza-se o operador `=`: +```matlab +>> x = 20 +x = + 20 +>> x = 'JBB' +x = +JBB +>> x = [10*2, pi] +x = + 20.0000 3.1416 +``` + +- - - - + +## Vetores +Para facilmente declarar um vetor pode-se utilizar o método de MATLAB em que se +indica o valor inicial e final do vetor e o incremento entre cada elemento. +```matlab +>> array = 1:2:9 +array = + 1 3 5 7 9 +``` +Omitindo o campo relativo ao incremento assume-se que seja 1. +```matlab +>> array = 1:4 +array = + 1 2 3 4 +``` + +- - - - + +## Matrizes +Para declarar uma matriz fila a fila, separando os elementos de cada fila com um +`;` ou com `\n` e a lista de elementos deve ser rodeada de `[]` +```matlab +>> A = [ 1:4 ; 5 6 7 8 ; 9:12 ; 14:17] +A = + 1 2 3 4 + 5 6 7 8 + 9 10 11 12 + 14 15 16 17 +``` +Para aceder a uma matriz utiliza-se o operador `()`, podendo ser indicado um +intervalo para obter uma slice da matriz +```matlab +>> A(2,3) +ans = + 7 + +>> A(2:4, 3:4) +ans = + 7 8 + 11 12 + 16 17 +``` + +- - - - + +## Funções pré-definidas importantes +| funcao | descricão | +| ----------- | -------------------------------------- | +| ones(n) | matriz de 1s tamanho nxn | +| zeros(n) | matriz nula de ordem n | +| eye(n) | matriz identidade de ordem n | +| (A)’ | transposta da matriz A | +| det(A) | determinante da matriz A | +| rank(A) | característica da matriz A | +| inv(A) | inversa da matriz A | +| diag(A) | diagonal da matriz A | +| triu(A) | matriz triangular superior da matriz A | +| tril(A) | matriz triangular inferior da matriz A | +| norm(A,1) | norma 1 da matriz A | +| norm(A,inf) | norma inf da matriz A | +| A \ b | resolução do sistema linear Ax = b | + +### Exemplo +```matlab +>> b=[1; 3; -6] +>> A=[1 -3 4; 2 5 -2; 3 8 10] +>> A\b %sistema linear Ax=b +ans = +2.2703 +-0.6216 +-0.7838 +``` + +- - - - + +## Definir Funções +```Matlab +function [output] = function_name(input) +output = operation_on_input +``` +**NOTA:** definir na *Function Window* + +### Exemplos +* definir uma função "normal" +```Matlab +function [f] = fun1(x) +f = x^2 + x +1 +``` + +* definir um sistema de equações +```Matlab +function [f] = fun2(x) +f(1) = x +f(2) = x^2 +``` + +**NOTA:** é possível definir lambdas com `@(x) operation_on_x` + + +## Alterar precisão +```matlab +format long % 15 casas decimais +format short % 5 casas decimais +``` diff --git a/MNOL-MATLAB/minimos_quadrados.md b/MNOL-MATLAB/minimos_quadrados.md new file mode 100644 index 0000000..26369e6 --- /dev/null +++ b/MNOL-MATLAB/minimos_quadrados.md @@ -0,0 +1,25 @@ +# Mínimos Quadrados +## Polinómios Ortogonais +```matlab +x = [1.5 2 3 4] +y = [4.9 3.3 2 1.5] + +[p,s] = polyfit(x,y,1) + +polyval(p,2.5) + +%Residuo do erro +(s.normr)^2 +``` + +## Modelo não polinomial linear +```matlab +x = [1.5 2 3 4] +y = [4.9 3.3 2 1.5] + +foo = @(c,x) c(1)./x + c(2).*x +[c,resnorm,residual,exitflag,out] = lsqcurvefit(foo,[1 1],x,y) + +%Residuo do erro +resnorm +``` diff --git a/MNOL-MATLAB/nelder-mead.md b/MNOL-MATLAB/nelder-mead.md new file mode 100644 index 0000000..55f75ad --- /dev/null +++ b/MNOL-MATLAB/nelder-mead.md @@ -0,0 +1,8 @@ +# Método de Nelder-Mead +```matlab +foo = @(x) max(abs(x(1)),abs(x(2)-1)) + +op = optimset('display','iter') + +[x,y,ef,out] = fminsearch(foo,[1 1],op) +``` diff --git a/MNOL-MATLAB/quasi-newton.md b/MNOL-MATLAB/quasi-newton.md new file mode 100644 index 0000000..ccda635 --- /dev/null +++ b/MNOL-MATLAB/quasi-newton.md @@ -0,0 +1,40 @@ +# Quasi-Newton +Este método apenas calcula o mínimo. Assim, para calcular o máximo utilizamos a +seguinte formula: +``` +max = -min(-f(x)) +``` + +## Sem derivadas +```matlab +foo = @(x) 0.25*x(1)^4-0.5*x(1)^2+0.1*x(1)+0.5*x(2)^2 +fminunc(foo) +% OU +[x,y,ef,out] = fminunc(@(x) 0.25*x(1)^4-0.5*x(1)^2+0.1*x(1)+0.5*x(2)^2,[-1 0.5]) +``` + +> Se `ef < 0` não converge + +> Se `ef = 0` atinge nº max iterações -> aumentar maxIter + +> Se `ef > 0` converge + +## Com derivadas +```matlab +function [f,g] = foo(x) + f = 0.25*x(1)^4-0.5*x(1)^2+0.1*x(1)+0.5*x(2)^2; + g(1) = x(1)^3 %derivada em x1 + g(2) = x(2) %derivada em x2 +end + +op = optimset('gradobj','on') +[x,y,ef,out] = fminunc('foo',[-1 0.5],op) + +``` + +### optimset options: +* 'tolfun',10 +* 'tolx',10 +* 'HessUpdate','DFP' +* 'MaxIter',10000 +* 'MaxFunEvals',10000 diff --git a/README.md b/README.md index 9412f7b..98a8c3f 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,9 @@ Para guardarem este repositório podem fazer `star`. * [Java](POO-Java/README.md) * [SO](SO/README.md) +## Terceiro ano + * [MNOL](MNOL-MATLAB/README.md) + # Contribuidores ## Resumos