Uso
MATLAB há mais de 25 anos. (E antes disso, eu até usei o
MATRIXx , ele
não conseguia descansar em paz.) Este
não é
o primeiro idioma em que aprendi a programar , mas é o idioma com o qual atingi a idade matemática. Conhecer o MATLAB tem sido gratificante para minha carreira.
No entanto, é impossível ignorar o crescimento do Python na computação científica. O MathWorks deve se sentir da mesma maneira: eles não apenas adicionaram a capacidade de
chamar Python diretamente do MATLAB , mas também emprestaram alguns de seus recursos de linguagem, como um
passe mais agressivo para os componentes binários do operador.
Chegou o momento em que questionei meu uso contínuo do MATLAB tanto na pesquisa quanto no ensino. No entanto, investi tanto nos materiais que foi difícil encontrar a motivação para aprender algo novo.

Este artigo foi traduzido com o suporte do software EDISON, que cuida da saúde dos programadores e do café da manhã e também desenvolve software personalizado .
Tutorial introdutório do MATLAB, que eu co-autor de matemática computacional. O livro contém mais de 40 funções e 160 exemplos computacionais e cobre o que, penso eu, é fundamental no uso do MATLAB para cálculos científicos numéricos. Em parte para aperfeiçoamento pessoal e em parte para aumentar a utilidade do livro este ano, decidi traduzir o código em
Julia e
Python . Essa experiência me levou a visões especiais em três idiomas com relação à computação científica, que estou tentando descrever abaixo.
Adiarei questões de custo e abertura. O MATLAB, diferentemente do Python e da Julia, não é um produto freeware. Essa é uma enorme diferença - para alguns, mas quero considerar os méritos técnicos. Por muitos anos, o MATLAB foi muito além de qualquer produto gratuito de várias maneiras muito úteis e, se você quiser ser produtivo, o custo será infernal. Esta é uma discussão separada do apelo platônico da linguagem e do ecossistema.
Se omitirmos questões relacionadas a custos, o motivo das muitas diferenças nesses idiomas está relacionado à sua origem. O MATLAB primeiro colocou uma prioridade no aspecto matemático, a saber, matemática computacional. O Python, que apareceu na década de 1980, colocou a ciência da computação em primeiro plano. Fundada em 2009, Julia estabeleceu a meta de alcançar um equilíbrio entre os dois idiomas anteriores.
MATLAB
Inicialmente, cada valor no MATLAB era uma matriz de números de ponto flutuante de precisão dupla. Ambos os aspectos dessa escolha, matrizes e números de ponto flutuante, foram inspirados por decisões de design.
O padrão IEEE 754 para números de ponto flutuante não foi adotado até 1985 e a memória foi medida em kilobytes, não gigabytes. Os números de ponto flutuante duplo não eram a maneira mais eficiente de exibir caracteres ou números inteiros, mas eram o que cientistas, engenheiros e todos os matemáticos queriam usar na maioria das vezes. Além disso, as variáveis não devem ser declaradas e a memória não deve ser alocada. Ao deixar seu computador lidar com essas tarefas e se livrar dos tipos de dados, você liberou seu cérebro para pensar em algoritmos que funcionarão com dados.
As matrizes são importantes porque os algoritmos numéricos na álgebra linear assumem suas próprias formas
LINPACK e
EISPACK . Mas acessá-los com um meio padrão em computação científica, o FORTRAN 77, foi um processo de várias etapas que envolveu declarar variáveis, invocar nomes ocultos de rotinas, compilar código e analisar dados e arquivos de saída. Gravar a multiplicação da matriz na forma de A * B e listar a resposta imediatamente levou a uma mudança no decorrer do jogo.
O MATLAB também tornou os gráficos simples e abertos. Não há bibliotecas complexas dependentes de máquina com chamadas de baixo nível, apenas plote (x, y) e você viu o que outra pessoa teria visto com o MATLAB. Houve ainda mais inovações, como números complexos e complexos, matrizes esparsas, ferramentas para criar interfaces gráficas de usuário de plataforma cruzada e um conjunto avançado de solucionadores de ODE que fizeram do MATLAB um lugar para a computação científica na velocidade do pensamento.
No entanto, um design ideal para computação interativa, mesmo longas, nem sempre contribuiu para a criação de programas bons e produtivos. A movimentação de dados entre muitas funções exigia a manipulação de uma variedade de variáveis e o acesso frequente à documentação dos argumentos de entrada e saída. Uma função por arquivo no disco em um espaço para nome simples era muito simples para um projeto pequeno, mas uma dor de cabeça para um projeto grande. Certos padrões de programação (vetorização, pré-alocação de memória) devem ter sido aplicados se você deseja evitar problemas com a velocidade computacional. Atualmente, a computação científica é aplicada a um número muito maior de áreas com um grande número de tipos diferentes de dados. Etc.
Em resposta, o MathWorks continuou a inovar no MATLAB: funções internas, funções aninhadas, variáveis finais, numerosos tipos de dados, funções orientadas a objetos, infra-estruturas de teste de unidade e assim por diante. Cada inovação provavelmente foi uma solução para um problema importante. Mas o acúmulo de 40 anos dessas mudanças teve um efeito colateral de obscurecer a simplicidade e a unidade do conceito. Em 2009,
escrevi um livro que abordava muito bem o básico do MATLAB em menos de 100 páginas. Até onde eu sei, todas essas coisas ainda estão disponíveis. Mas você precisa saber muito mais agora para se considerar um profissional.
Python
Em parte, a história do Python é uma imagem espelhada da história do MATLAB. Os dois idiomas tinham uma linha de comando interativa (agora é chamado de REPL é uma abreviação de loop de impressão de avaliação de leitura, que se traduz como um loop de leitura-avaliação-impressão, além de liberdade de várias declarações e compilações. No entanto, o MatLab foi criado principalmente com o objetivo de calcular análise, enquanto o python foi criado para hackers.Em seguida, cada um dos idiomas conseguiu expandir sua base de usuários, atualizando e expandindo a funcionalidade.
Na minha opinião, Python ainda está sofrendo com a pobreza de seu aparato matemático. Ele contém pequenas coisas desconfortáveis, como a presença de ** em vez de ^, @ é usada para multiplicar matrizes (foi adicionada recentemente!), Não o tamanho, mas a forma da matriz, o armazenamento orientado a linhas, etc. Se você acha que V.conj (). T @ D ** 3 @ V é mais elegante que V ∗ D
3 V, provavelmente você não está bem com sua cabeça. Além disso, a indexação começa em 0 (em vez de 1). Tive a oportunidade de me familiarizar com a
opinião oposta , no entanto, na minha opinião, não é tão convincente. Obviamente, tudo isso é uma questão de preferência pessoal, um assunto de guerras santas na Internet, pois você sempre pode dar um exemplo complicado para sua vantagem: o que exatamente é para mim parece convincente, porque por décadas sempre iniciamos a indexação matemática de vetores e matrizes com 1, e muitos pseudo-códigos são baseados nessa suposição.
Além de alguns inconvenientes, acho o sistema Python + NumPy + SciPy complicado e inconsistente, um bom exemplo é o fato de que, apesar do forte foco no objeto, existem classes de matriz lá e
seu uso não é recomendado , talvez o MatLab me estrague dessa maneira, mas considero as matrizes um objeto importante que deve ser mantido à mão e usado ativamente. A capacidade de usar * para executar várias operações com matrizes e matrizes é o principal recurso do OOP? Em geral, existem muitos momentos infelizes a esse respeito: (Por que preciso do comando
spsolve ? Por que não consigo aplicar o comando de resolução a uma matriz esparsa? E ainda há muito disso).
Também existem lugares onde o ecossistema numérico parece um pouco pior. Por exemplo, os
solucionadores quadrado e
ODE parecem minimalistas em 2019. até onde sei, não há métodos para solucionadores DAE, DDE, simpléticos ou implícitos que permitam as iterações internas de Krylov. Veja, essas funções têm na maioria das vezes 30 anos ou mais - ainda são boas, mas estão longe de serem perfeitas. O Matplotlib é um pacote incrível de se trabalhar e, em alguns casos, parecia melhor que o MATLAB, mas sinto falta do 3D.
Alguns especialistas argumentam que existem razões pelas quais o código Python está tentando combater a velocidade com linguagens compiladas. Estou surpreso com o resultado da pesquisa "
python é muito lento ". Os campeões do Python citam muitos dos argumentos / desculpas que as pessoas fizeram para o MATLAB naquela época. Isso não significa que eles estejam errados, mas é mais do que apenas um
problema de percepção .
Entendo por que o Python foi tão emocionante para muitas pessoas na computação científica. Possui alguma sintaxe e o poder do MATLAB, disponível no REPL. Possui excelentes ferramentas e funciona bem com outras linguagens e áreas de computação. Ele o ofereceu de graça e com muito melhor reprodutibilidade a longo prazo. Obviamente, isso funciona bem para muitas pessoas que provavelmente veem poucas razões para mudar.
Por causa do que sei fazer em computação científica, o Python me obriga a fazer mais trabalhos rotineiros de aprendizado e uso do que estou acostumado. Por algum tempo, não saberemos se ela continuará na comunidade ou se já está perto do seu auge.
Julia
Julia tem suas vantagens e desvantagens, já que é tarde. Admiro os criadores de Julia por entenderem que eles
poderiam fazer maisQueremos um idioma de código aberto com uma licença de biblioteca. Queremos velocidade C com dinâmica Ruby. Queremos que a linguagem seja homoiônica, com macros reais como Lisp, mas com notações matemáticas óbvias e familiares, como no Matlab. Queremos algo tão programável como Python, tão simples para estatísticas como R, tão natural para processamento de strings como Perl, tão poderoso para álgebra linear como Matlab e capaz de colar programas como um shell . Algo fácil de aprender, mas ao mesmo tempo agrada aos hackers mais sérios. Queremos que seja interativo e que seja compilado.
Eu acredito que, em grande parte, eles conseguiram. No lançamento da versão 1.0, eles pareciam um pouco diferentes do REPL e do MATLAB. (Qual é a precisão do LinRange melhor do que o espaço interno?) Embora seja preciso escolher.
Este é o primeiro idioma que usei, com a capacidade de ir além do ASCII. Sinto uma satisfação excessiva com o uso de variáveis como Phi e operadores como ≈. É mais do que um belo invólucro; poder parecer mais com as expressões matemáticas que escrevemos é uma vantagem real, embora complique um pouco o aprendizado e a documentação.
Os trabalhos na Julia me mostraram que eu adquiri algumas habilidades de programação por causa da escolha do MATLAB, e não por causa de sua superioridade inerente. A vetorização não é natural para muitas coisas. Julia revela que você pode vetorizar qualquer função simplesmente adicionando um ponto ao seu nome. Construir uma matriz usando a
compreensão faz com que loops aninhados (ou truques de grade) pareçam chicotes errados em comparação, e ignorar a matriz como um todo com um
gerador de soma simples é como obter algo por nada. (Eu sei que o Python possui recursos de linguagem semelhantes.)
O grande recurso do
envio múltiplo torna algumas coisas muito mais fáceis e mais compreensíveis do que a orientação do objeto. Por exemplo, suponha que você tenha as classes Wall e Ball em uma linguagem tradicional orientada a objetos.Que classe deve detectar a colisão de uma bola com uma parede? Ou você precisa de uma aula para interpretar o árbitro? Perguntas como essa podem me distrair. Com o planejamento múltiplo, os dados são compactados em tipos de objetos, mas os métodos que trabalham com dados não são vinculados a uma classe. Então
função detect_collision (B :: Ball, W :: Wall)
conhece os tipos, mas é determinado independentemente deles. Levei muita programação para entender o quão interessante e potencialmente importante é o conceito de despacho múltiplo para expandir a linguagem.
O ecossistema numérico está se desenvolvendo rapidamente. Meu exemplo número um é o
DifrentialEquations.jl , escrito pelo maravilhoso
Chris Rakautskas . Se este software não ganhar o Prêmio Wilkinson tão cedo, o sistema está com defeito. Basta ir ao site e prepare-se para apelar.
Ainda não vi os grandes ganhos de velocidade sobre o MATLAB que Julia promete. Isso é em parte minha inexperiência relativa e os tipos de tarefas que realizo, mas em parte porque o MathWorks fez um trabalho incrível de otimização automática do código. De qualquer forma, esse não é o aspecto da codificação que eu me concentro na maior parte do tempo.
A programação em Julia levou algum tempo para me sentir confortável (talvez eu esteja ficando velha e cristalizada). Isso me faz pensar sobre os tipos de dados mais do que gostaria, e sempre há uma suspeita de que eu perdi o caminho certo para fazer alguma coisa. Mas, para uso diário, provavelmente me voltarei para Julia como MATLAB.
Sumário
O MATLAB é uma solução corporativa, usada principalmente para solucionar problemas de engenharia. Continua sendo a ferramenta mais simples para resolver problemas numéricos. Documentação muito importante e desenvolvimento de dez anos da empresa, sem dúvida, desempenham um papel importante nisso.
O MATLAB é como um sedan BMW do mundo da computação científica. É caro, mesmo antes de você falar sobre acessórios (kit de ferramentas). Você paga pela operação e serviço impecáveis e ininterruptos. Mas também atrai uma
quantidade desproporcional
de ódio .
Python é uma caminhonete Ford. É onipresente e amado por muitos (nos EUA). Ele pode fazer o que você quiser e foi projetado para fazer o que outros carros não podem. Provavelmente, você vai querer agora e depois. Mas isso não oferece muita experiência de direção.
Julia é Tesla. Ele é construído com o objetivo ousado de mudar o futuro e é possível. Mas também pode ser apenas uma menção. Ao mesmo tempo, você chegará onde está com estilo e com uma grande oferta de força.

Leia também o blog
Empresa EDISON:
20 bibliotecas para
aplicação iOS espetacular