2015-04-21 20 views
5

Mam jeden program MATLAB, ale chcę przekształcić w Pythonie, mój kod Matlab jest:fsolve na pytona (konwersja matlab kod do kodu Pythona)

function [f]=equation1(x) 
%options = optimoptions('fsolve','TolFun',1.1e-20,'TolX',1.1e-20,'maxIter',Inf,'MaxFunEvals',Inf); 
c = 330 ;%speed of sound meters per second 
% unknown variable : 
% r1 => x(1) 
% theta => x(2) 

time2 = 0.455; % Microphone 1 to Microphone 2 time delay 
time3 = 0.606; % Microphone 1 to Microphone 3 time delay 
% gives : 
r2 = 150 %time2*c; 
r3 = 200 %time3*c; 

r4 = 499.1; % Distance from Microphone 2 to Microphone 3 
r5 = 1267.9;% Distance from Microphone 1 to Microphone 3 

phi = 16.177; % Angle between Microphone 1 and Microphone 2 measured from Microphone 3 
% 
f(1)= (x(1) + r2)^2- (x(1)+r3)^2 -r4^2 +2*(x(1)+r3)*r4*cosd(x(2)); 
f(2)= x(1)^2 - (x(1)+r3)^2 - r5^2 + 2*(x(1)+r3)*r5*cosd(x(2)-phi); 

Iplay ten kod z [x, feval] = fsolve (@ równanie 1, [100 10]); wróci Dobra jakość (1620.7 076,4) Ale pytona mam uczynić ten program

from scipy.optimize import fsolve 
import math 

def cosd(x): 
    return math.cos(x * math.pi/180); 


def equations(p): 
    time2 = 0.455 # Microphone 1 to Microphone 2 time delay 
    time3 = 0.606 # Microphone 1 to Microphone 3 time delay 
    # gives : 
    r2 = 150. #time2*c; 
    r3 = 200. #time3*c; 

    r4 = 499.1 # Distance from Microphone 2 to Microphone 3 
    r5 = 1267.9 # Distance from Microphone 1 to Microphone 3 

    phi = 16.177 # Angle between Microphone 1 and Microphone 2 measured from Microphone 3 
     r1, theta = p 
    f1 = (r1 + r2)**2. -(r1+r3)**2 -r4**2 +2*(r1+r3)*r4*(cosd(theta)) 
    f2 = r1**2 - (r1+r3)**2 - r5**2 + 2*(theta+r3)*r5*(cosd(theta-phi)) 
     return (f1,f2) 

x, y = fsolve(equations, (1000.0, 20.0), xtol=1e-06, maxfev=10000000) 

print x,y, equations((x, y)) 

Ale kiedy biegnę, mam złą wartość z tego błędu:

Iteracja nie robi postępy, mierzone poprawą z ostatnich pięciu ocen Jakuba. warnings.warn (MSG, RuntimeWarning) (-167.792,68841940007, -1.096.453,7938717711)

ktoś powiedzieć, dlaczego to nie działa w Pythonie?

EDYCJA => Zmieniam kod Pythona dla problemu w stopniu. Ale nie mam dobrej wartości (Python return -4263.77780373 -272.257364385, to daleko od wartości matlab).

Odpowiedz

3

Myślę, że problemem jest to odejmowanie:

(theta-phi) 

w MATLAB jesteś odjęcie stopni, ale na pytona theta jest w dregrees i phi jest w radiands.

0

Dziękuję, znalazłem mój błąd (z Waszą pomocą)

  • jeden dla Cosinus, mam rozwiązać za pomocą tej funkcji:

    def cosd (x): matematyki powrotną. cos (x * math.pi/180);

    • i drugi mam inwertowany R1 przez theta w

F2 = R1 ** 2 - (R1 + R3) ** 2 - (R5) 2 ** 2 * (r1 + r3) r5 (cosd (theta-phi))