在python中使用norm和fsolve的问题

时间:2019-10-31 08:38:31

标签: python matlab norm

我必须将一个函数从matlab转移到python,也许,我大部分时间都把代码的一部分弄得一团糟 1.-我知道matlab中的函数范数默认情况下会返回Euclidan形式,因此,当使用np.linalg.norm时,我必须使用语法(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))

0 个答案:

没有答案