Проблемы с использованием norm и fsolve в python - PullRequest
0 голосов
/ 31 октября 2019

Мне нужно перенести функцию из matlab в python, возможно, я в основном запутался с какой-то частью кода 1.- Я понимаю, что норма функции в matlab возвращает евклидову форму по умолчанию, поэтому при использовании np.linalg. Я должен использовать синтаксис (nu, 2), это дает мне ошибку «Неправильное количество измерений в норме». 2.- Искренне, я понятия не имею, что происходит с частью fsolve.

Это код Matlab:

Gp=G+1;
Gm=G-1;
if M~=0;
    nu = sqrt(Gp/Gm).*atand(sqrt(Gm*(M.^2-1)/Gp))-atand(sqrt(M.^2-1));
    mu = asind(1./M);
elseif norm(nu)~=0;
    %Nu = @(Mg)sqrt(Gp/Gm)*atand(sqrt(Gm*(Mg.^2-1)/Gp))-atand(sqrt(Mg.^2-1))-nu;
    for i=1:length(nu(1,:))
        for j = 1:length(nu(:,1))
            M(j,i) = fzero(@(Mg)sqrt(Gp/Gm)*atand(sqrt(Gm*(Mg.^2-1)/Gp))...
                -atand(sqrt(Mg.^2-1))-nu(j,i),[1 100]);
        end
    end
    mu = asind(1./M);
elseif mu~=0;
    M=1./sind(mu);
    nu=sqrt(Gp/Gm)*atand(sqrt(Gm*(M.^2-1)/Gp))-atand(sqrt(M.^2-1));
end

Это то, что я сделал в Python, первый и третийусловная работа, как указано.

import numpy as np
import scipy

def PMF(G=None,M=None,nu=None,mu=None): 

    Gp=G + 1
    Gm=G - 1
    if M != 0:
        nu=np.multiply(np.sqrt(Gp / Gm),np.arctan(np.sqrt(np.multiply(Gm,(M ** 2 - 1)) / Gp))) - np.arctan(np.sqrt(M ** 2 - 1))
        mu=np.arcsin(1.0 / M)

    elif np.linalg.norm(nu,2)!=0:
        for i in np.arange(1,np.size(nu(1,np.arange[1,]))):
            for j in np.arange(1,np.size(nu[:,1])):
                M[j,i]=scipy.optimize.fsolve(lambda Mg=None: np.dot(np.sqrt(Gp / Gm),np.arctan(np.sqrt(np.dot(Gm,(Mg ** 2 - 1)) / Gp))) - np.arctan(np.sqrt(Mg ** 2 - 1)) - nu(j,i),np.concat([1,100]))
        mu=np.arcsin(1.0 / M)
    else:
        if mu != 0:
            M=1.0 / np.sin(mu)
            nu=np.dot(np.sqrt(Gp / Gm),np.arctan(np.sqrt(np.dot(Gm,(M ** 2 - 1)) / Gp))) - np.arctan(np.sqrt(M ** 2 - 1))

...