在Python中使用fsolve(将Matlab代码转换为Python代码)

5

我有一个matlab程序,但我想将其转换为python,我的matlab代码如下:

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);

我使用 [x,feval]=fsolve(@equation1,[100 10]) 运行这段代码,它返回了良好的数值 (1620.7 076.4)。但是在Python中,我需要编写以下程序:

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))

但是当我运行时,遇到了这个错误:

由于上一次的五次雅可比评估没有得到改善,迭代没有取得良好的进展。
warnings.warn(msg, RuntimeWarning)
(-167792.68841940007, -1096453.7938717711)

有人能说说为什么在Python上不起作用吗?

编辑 => 我更改了问题度数的Python代码。 但是我没有得到正确的值(Python返回-4263.77780373 -272.257364385,与Matlab值相差很远)。

2个回答

3

我认为问题出在这个减法运算上:

(theta-phi)

在Matlab中,您正在减去度数,但在Python中,theta以度为单位,phi以弧度为单位。


0

谢谢,我已经找到了我的错误(在您的帮助下)

  • 其中一个是余弦值,在这个函数中已经解决:

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

    • 另外一个错误是我在theta处将r1反转了

f2 = r1**2 - (r1+r3)**2 - (r5)**2 + 2*(r1+r3)r5(cosd(theta-phi))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接