Есть ли в Python эквивалентный решатель, такой как vpasolve от MATLAB? - PullRequest
2 голосов
/ 16 февраля 2020

Я работаю над эмуляцией кода MATLAB в Python. Проблема в том, что точная реализация Matlab vpasolve недоступна в Python. Я использовал fsolve для решения уравнения, но решение в MATLAB другое и Python.

Я хотел бы знать, есть ли другой доступный решатель в Python, который может работать так же, как vpasolve.

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Код MATLAB выглядит следующим образом

for i=1:length(wdth_var)
    gp_wdth(i)=gp_org+2*(wdth_org-wdth_var(i));%gap
    N1(i)=k0*wdth_var(i)/2*sqrt(n_e^2-(beta_s/k0)^2);
    N2(i)=k0*wdth_var(i)/2*sqrt((beta_s/k0)^2-n_f^2);
    f1=tan(2*N1(i));
    f2=((N1(i)*N2(i)*(1+tanh(2*N2(i)*(gp_wdth(i)/2)/wdth_var(i))))/(N1(i)^2-(N2(i)^2*tanh(2*N2(i)*(gp_wdth(i)/2)/wdth_var(i)))));
    f3=((N1(i)*N2(i)*(1+coth(2*N2(i)*(gp_wdth(i)/2)/wdth_var(i))))/(N1(i)^2-(N2(i)^2*coth(2*N2(i)*(gp_wdth(i)/2)/wdth_var(i)))));

  n_effe_wdth(i)=vpasolve(f1-f2==0,beta_s,[10 20])
  n_effo_wdth(i)=vpasolve(f1-f3==0,beta_s,[10 20])/k0;
end

Я хочу эмулировать точный код MATLAB в Python. Когда я использую пакет sympy Python, код переходит в бесконечное число l oop. Позже я использовал пакет numpy, ответы которого нигде не похожи на то, что я получаю в MATLAB

Python numpy код пакета:

for in range (len(wvl)):
k0wvl = 2*pi/wvl[i]
n_e_wvl_demo = n_e_wvl[i]


f3 = lambda beta_s: np.tan(k0wvl*wdth_org/2*(np.sqrt((n_e_wvl_demo**2 - (beta_s/k0wvl)**2)))) - ((((k0wvl*wdth_org/2*(np.sqrt((n_e_wvl_demo**2 - (beta_s/k0wvl)**2))))) * (k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2)))) * (1 + np.tanh(2 * (k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2)))) * (gp_org / 2) / wdth_org))) / (((k0wvl*wdth_org/2*(np.sqrt((n_e_wvl_demo**2 - (beta_s/k0wvl)**2)))))**2 - ((k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2))))**2 * np.tanh(2 * (k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2)))) * (gp_org / 2) / wdth_org))))

f4 = lambda beta_s: np.tan(k0wvl*wdth_org/2*(np.sqrt((n_e_wvl_demo**2 - (beta_s/k0wvl)**2)))) - ((((k0wvl*wdth_org/2*(np.sqrt((n_e_wvl_demo**2 - (beta_s/k0wvl)**2)))))* (k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2)))) * (1 + (1/(np.tanh(2 * (k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2)))) * (gp_org / 2) / wdth_org))))) / (((k0wvl*wdth_org/2*(np.sqrt((n_e_wvl_demo**2 - (beta_s/k0wvl)**2)))))**2 -  ((k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2))))**2 * (1/(np.tanh(2 *  (k0wvl*wdth_org/2*(np.sqrt(((beta_s/k0wvl)**2 - n_f**2)))) * (gp_org / 2) / wdth_org))))))

a = (fsolve(f3, [10, 20]))/k0wvl
a_1.append(a[0])

b = (fsolve(f4, [10, 20])) / k0wvl
b_1.append(b[0])

Я хотел бы знать, если В Python есть любой другой решатель, который может работать точно так же, как vpasolve, и давать те же ответы, что и MATLAB.

0 голосов
/ 22 февраля 2020

vpasolve не является точным, вместо этого он позволяет решать с более высокой точностью, определяемой цифрами. В то время как MATLAB называет это переменной точности, другие области в основном называют ее произвольной точностью. Ваш ближайший эквивалент vpasolve будет использовать mpmath в python.

Если вы вместо этого стремитесь к точному решению с использованием вычисления Symboli c, Sympy будет вашим выбором.

...