Ajude a manter o site livre, gratuito e sem propagandas. Colabore!
GSL (GNU Scientific Library) é uma biblioteca de métodos numéricos para C/C++. É um software livre sobre a GNU General Public License e está disponível em
A biblioteca fornece uma grande número de rotinas matemáticas para várias áreas da análise numérica. Aqui, vamos nos concentrar em uma rápida introdução à computação matricial.
A alocação de um vetor no GSL segue o estilo de malloc (alocação de memória) e free (liberação de memória). O suporte a vetores requer a importação da biblioteca gsl_vector.h.
No seguinte código, alocamos e imprimimos o seguinte vetor
(18) |
(Inicialização.) Alternativamente, a alocação com o método
cria um vetor e inicializada todos os seus elementos como zero. Outros métodos de inicialização estão disponíveis, consulte GSL Docs: Initializing vector elements.
Operações básicas envolvendo vetores do GSL estão disponíveis com os seguintes métodos1717endnote: 17Mais detalhes, consulte GNU Docs: Vector operations.:
int gsl_vector_add(gsl_vector *a, const gsl_vector *b)
Computa a adição vetorial a + b e o resultado é armazenado no vetor a.
int gsl_vector_sub(gsl_vector *a, const gsl_vector *b)
Computa a subtração vetorial a - b e o resultado é armazenado no vetor a.
int gsl_vector_mul(gsl_vector *a, const gsl_vector *b)
Computa a multiplicação elemento-a-elemento a*b e armazena o resultado no vetor a.
int gsl_vector_div(gsl_vector *a, const gsl_vector *b)
Computa a divisão elemento-a-elemento a/b e armazena o resultado no vetor a.
int gsl_vector_scale(gsl_vector *a, const double x)
Computa a multiplicação por escalar x*a e armazena o resultado no vetor a.
int gsl_vector_add_constant(gsl_vector *a, const double x)
Re-computa o vetor a somando o escalar x a cada um de seus elementos.
double gsl_vector_sum(const gsl_vector *a)
Retorna a soma dos elementos do vetor a.
(Suporte BLAS.) O GSL também fornece suporte a biblioteca BLAS (Basic Linear Algebra Subprograms) pelo gsl_blas.h. Operações vetoriais estão disponíveis no nível 1 da biblioteca. Para mais informações e acesso à documentação sobre os métodos disponíveis, consulte
No código abaixo, computamos para o escalar e os vetores
(19) | ||||
Faça um código para computar o produto escalar dos vetores
(20) | |||
(21) |
Crie sua própria função double dot(const gsl_vector *x, const gsl_vector *y) que recebe os vetores e retorna o produto escalar deles.
Use o método BLAS gsl_blas_dsdot.
Faça um código para computar a norma do vetor
(22) |
Crie sua própria função double norm2(const gsl_vector *x) que recebe o vetor e retorna sua norma.
Use o método BLAS gsl_blas_dnrm2.
Assim como vetores, a alocação de matrizes no GSL segue o estilo malloc e free. O suporte a matrizes requer a importação da biblioteca gsl_matrix.h.
No seguinte código, alocamos e imprimimos a matriz
(23) |
(Inicialização de Matrizes.) Matrizes podem ser inicializadas com todos os seus elementos nulos usando
Outros métodos de inicialização também estão disponíveis, consulte
https://www.gnu.org/software/gsl/doc/html/vectors.html#initializing-matrix-elements.
O GSL conta com os seguintes métodos de operações matriciais1818endnote: 18Consulte a lista completa em GSL Docs: Matrix operations.:
int gsl_matrix_add(gsl_matrix *a, const gsl_matrix *b)
Computa a adição matricial a + b e armazena o resultado em a.
int gsl_matrix_sub(gsl_matrix *a, const gsl_matrix *b)
Computa a subtração matricial a - b e armazena o resultado em a.
int gsl_matrix_mul_elements(gsl_matrix *a, const gsl_matrix *b)
Computa a multiplicação elemento-a-elemento a*b e armazena o resultado em a.
int gsl_matrix_div_elements(gsl_matrix *a, const gsl_matrix *b)
Computa a divisão elemento-a-elemento a/b e armazena o resultado em a.
int gsl_matrix_scale(gsl_matrix *a, const double x)
Computa a multiplicação por escalar x*a e armazena o resultado em a.
int gsl_matrix_add_constant(gsl_matrix *a, const double x)
Re-computa a matriz a somando x a cada um de seus elementos.
(Operações Matrix-Vetor e Matriz-Matriz.) Na GSL, operações matrix-vetor estão disponíveis no suporte BLAS de nível 2. Já, operações matriz-matriz, no suporte BLAS de nível 3. Consulte a lista completa de métodos em
https://www.gnu.org/software/gsl/doc/html/blas.html#blas-support.
O seguinte código verifica se é solução do sistema linear
(24) | ||||
Crie uma função para computar a norma de Frobenius de uma matriz . Teste seu código com a matriz
(25) |
Faça um código para verificar se a matriz
(26) |
é inversa de
(27) |
A GSL tem suporte à álgebra linear pelo módulo gsl_linalg.h. Métodos para a decomposição LU, QR, Cholesky entre tantos outros métodos estão disponíveis. Consulte a lista completa em
https://www.gnu.org/software/gsl/doc/html/linalg.html#linear-algebra.
No seguinte código, computamos a solução do sistema
(28) | ||||
pelo método LU.
Crie sua própria função para a computação da solução de sistemas triangulares inferiores. Verifique seu código para o sistema
(29) | ||||
Crie sua própria função para a computação da solução de um sistemas triangulares superiores. Verifique seu código para o sistema
(30) | ||||
Faça um código para resolver o sistema linear
(31) | ||||
na sua forma matricial .
Use int gsl_linalg_LU_decomp(gsl_matrix *A, gsl_permutation *p, int *signum) para computar a decomposição , onde é a matriz de coeficientes do sistema.
Use sua função criada no Exercício 4.4.1 para resolver , onde o vetor dos termos constantes do sistema.
Use sua função criada no Exercício 4.4.2 para resolver .
Faça um código para computar a solução do sistema
(32) | ||||
para , . Dica: use o método gsl_linalg_solve_tridiag.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a Política de Uso de Dados para mais informações. Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!