我必须将一个函数从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))