Python 相同的方程式在Matlab和Numpy中给出不同的值?
我正在尝试将一个函数从Matlab转换为Python。Matlab的功能是:Python 相同的方程式在Matlab和Numpy中给出不同的值?,python,matlab,numpy,Python,Matlab,Numpy,我正在尝试将一个函数从Matlab转换为Python。Matlab的功能是: function [f,df_dr1,df_dr2,g,dg_dr1,dg_dr2] = f_eval_2eq(r1,r2,r3,z1,z2,z3,n1,n2,n3) f = (r1)./sqrt(r1.^2 + z1.^2)... - (n2/n1)*(r2-r1)./sqrt((r2-r1).^2 + z2.^2); df_dr1 = 1./sqrt(r1.^2 + z1.^2)... - r1.^2
function [f,df_dr1,df_dr2,g,dg_dr1,dg_dr2] = f_eval_2eq(r1,r2,r3,z1,z2,z3,n1,n2,n3)
f = (r1)./sqrt(r1.^2 + z1.^2)...
- (n2/n1)*(r2-r1)./sqrt((r2-r1).^2 + z2.^2);
df_dr1 = 1./sqrt(r1.^2 + z1.^2)...
- r1.^2./(r1.^2 + z1.^2).^(3/2)...
+ (n2/n1)./sqrt(z2.^2 + (r1-r2).^2)...
- (n2/n1).*(r1-r2).*(2*r1-2*r2)./(2*((r1-r2).^2 + z2.^2).^(3/2));
df_dr2 = (n2/n1).*(r1-r2).*(2*r1-2*r2)./(2*((r1-r2).^2 + z2.^2).^(3/2))...
- (n2/n1)./sqrt(z2.^2 + (r1-r2).^2);
g = (r2-r1)./sqrt((r2-r1).^2 + z2.^2)...
- (n3/n2)*(r3-r2)./sqrt((r3-r2).^2 + z3.^2);
dg_dr1 = (r1-r2).*(2*r1-2*r2)./(2*((r1-r2).^2 + z2.^2).^(3/2))...
- 1./sqrt(z2.^2 + (r1-r2).^2);
dg_dr2 = 1./sqrt((r1-r2).^2 + z2.^2)...
+ (n3/n2)./sqrt(z3.^2 + (r2-r3).^2)...
- (r1-r2).*(2*r1-2*r2)./(2*((r1-r2).^2 + z2.^2).^(3/2))...
- (n3/n2).*(r2-r3).*(2*r2-2*r3)./(2*((r2-r3).^2 + z3.^2).^(3/2));
end
%test code
K>> a=[1,2,3];b=a+1;c=b+1;d=a;e=b;f=c;g=1;h=2;i=3;
K>> [f,df_dr1,df_dr2,g,dg_dr1,dg_dr2] = f_eval_2eq(a,b,c,d,e,f,g,h,i)
我编写的Python函数是:
def f_eval_2eq(r1,r2,r3,z1,z2,z3,n1,n2,n3):
#evaluate gradients
#n_ are scalars
f = (r1)/np.sqrt(r1**2 + z1**2) \
- (n2/n1)*(r2-r1)/np.sqrt((r2-r1)**2 + z2**2);
df_dr1 = 1/np.sqrt(r1**2 + z1**2) \
- r1**2/((r1**2 + z1**2)**(3/2)) \
+ (n2/n1)/np.sqrt(z2**2 + (r1-r2)**2) \
- (n2/n1)*(r1-r2)*(2*r1-2*r2)/(2*((r1-r2)**2 + z2**2)**(3/2));
df_dr2 = (n2/n1)*(r1-r2)*(2*r1-2*r2)/(2*((r1-r2)**2 + z2**2)**(3/2)) \
- (n2/n1)/np.sqrt(z2**2 + (r1-r2)**2);
g = (r2-r1)/np.sqrt((r2-r1)**2 + z2**2) \
- (n3/n2)*(r3-r2)/np.sqrt((r3-r2)**2 + z3**2);
dg_dr1 = (r1-r2)*(2*r1-2*r2)/(2*((r1-r2)**2 + z2**2)**(3/2)) \
- 1/np.sqrt(z2**2 + (r1-r2)**2);
dg_dr2 = 1/np.sqrt((r1-r2)**2 + z2**2) \
+ (n3/n2)/np.sqrt(z3**2 + (r2-r3)**2) \
- (r1-r2)*(2*r1-2*r2)/(2*((r1-r2)**2 + z2**2)**(3/2)) \
- (n3/n2)*(r2-r3)*(2*r2-2*r3)/(2*((r2-r3)**2 + z3**2)**(3/2));
return (f,df_dr1,df_dr2,g,dg_dr1,dg_dr2)
#test code
A=np.array([1,2,3])
B=A+1
C=B+1
D=A
E=B
F=C
G=1
H=2
I=3
[f,df_dr1,df_dr2,g,dg_dr1,dg_dr2] =f_eval_2eq(A,B,C,D,E,F,G,H,I)
print ('f= '+str(f) +'\n'+'df_dr1= '+str(df_dr1) +'\n' +'df_dr2='+str(df_dr2) +'\n'+'g= '+str(g) +'\n'+'dg_dr1= '+str(dg_dr1) +'\n'+'dg_dr2= '+str(dg_dr2) +'\n')
f的输出在两者中是相同的,但所有其他值都不同,我不明白为什么
非常感谢您的帮助。在Python2.x中,如果您将两个整数(例如
2
和3
)除,结果也将转换为整数:
x = 3/2
# 1
type(x)
# <type 'int'>
在Python2.x中,如果将两个整数(例如
2
和3
)除,结果也将转换为整数:
x = 3/2
# 1
type(x)
# <type 'int'>
您还可以添加
from __future__ import division
如果您使用的是Python2,为了获得Python3的行为,也就是说,始终使用浮点除法。您还可以添加
from __future__ import division
如果您使用的是Python2,请将其放在文件的顶部,以便获得Python3的行为,即始终使用浮点除法。Python2.x还是3.x?你有
3/2
而不是3/2
到处都是Python 2.x或3.x?你有3/2
而不是3/2
这一切……听起来可能是问题所在。添加[r1,r2,r3,z1,z2,z3,n1,n2,n3]=np.float([r1,r2,r3,z1,z2,z3,n1,n2,n3])
可以解决这个问题吗?@user3769033只需在整个代码中的所有整数之后添加一个显式
,就可以了。现在f和g是正确的,但其他值仍然不同?@user3769033是否将其添加到所有事件中?还有比我在回答中指出的更多的问题。非常小心地走过去。打得好。谢谢这…听起来可能是问题所在。添加[r1,r2,r3,z1,z2,z3,n1,n2,n3]=np.float([r1,r2,r3,z1,z2,z3,n1,n2,n3])
可以解决这个问题吗?@user3769033只需在整个代码中的所有整数之后添加一个显式
,就可以了。现在f和g是正确的,但其他值仍然不同?@user3769033是否将其添加到所有事件中?还有比我在回答中指出的更多的问题。非常小心地走过去。打得好。谢谢