Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Comment passer ce code de mathlab à Python

+1 vote

Je n'arrive pas à convertir ce code de mathlab vers python, comment devrais-je faire selon vous ?

function [uh] = trigonometric(x,n,U)
     X = (2*pi/(2*n+1))*[0:2*n]';
     Phi = exp(i * X * [-n:n]);
     a = Phi \ U;
     phi = exp(i * x * [-n:n]);
     uh = real(phi * a);
end
demandé 1-Oct par amau (112 points)
edité 1-Oct par bubulle

Va falloir nous expliquer ce que font les opérations suivantes car nous ne sommes pas des experts Matlab ici :

<value0> * [<value1>:<value2>]

et

[<value0>:<value1>]'

et

<value0> \ <value1>

[a:b] <=> np.arange(a, b+1)
[a, b]' <=> np.arange(a, b+1)[:, np.newaxis]
A\b <=> np.linalg.inv(A, b)

une ressource utile: https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html

Comme indiqué par debnet, quelques explications pourraient aider.
En particulier, avoir une idée du type de données pour les paramètres x, n et U (taille en particulier si ce sont des matrices). Cette fonction Matlab ne marche pas sous Octave en prenant des scalaires ou des vecteurs au hasard.

operator \: nonconformant arguments (op1 is 85x85, op2 is 1x5)

avec les chiffres de l'exemple de la solution proposée par bubulle, qui ne fonctionne pas dans mon cas (Python v3.4.3), même en remplaçant np.linalg.inv par np.linalg.solve. Mais avec une erreur qui semble similaire à celle rencontrée sous Octave, donc c'est cohérent

ValueError: solve1: Operand 1 has a mismatch in its core dimension 0, with gufunc signature (m,m),(m)->(m) (size 5 is different from 85)

En complément du lien de bubulle, voir aussi ça:
mathesaurus.sourceforge.net/matlab-python-xref.pdf

Je trouve ce document très pratique pour rapidement trouver l'équivalent entre Matlab, R et Python

1 Réponse

+2 votes
import numpy as np

def trigonometric(x, n, U):
    r = np.arange(2*n+1)
    rr = 1j * (r - n)
    X = (2*np.pi/(2*n+1)) * r[:, np.newaxis]
    Phi = np.exp(X * rr)
    a = np.linalg.inv(Phi, U)
    x = x.reshape(-1, 1)
    phi = np.exp(x * rr)
    uh = np.real(phi.dot(a))
    return uh

# usage (je mets des valeurs sorties de nulle part pour l'exemple)
mon_x = np.array([1, 2, 3, 4, 5])
mon_U = np.array([-10, -20, -30, -40, -50])
mon_n = 42
mon_uh = trigonometric(mon_x, mon_n, mon_U)

Remarque: je n'ai pas cherché à comprendre le sens de la fonction et je n'ai pas testé le code.

une ressource utile : https://docs.scipy.org/doc/numpy/user/numpy-for-matlab-users.html

répondu 1-Oct par bubulle (2,212 points)
...