Мне нужно перенести функцию из 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))