我必须用三个方程来解决一个非线性问题。等式的变量是Bx,By,Bz(我是从excel文件导入的),mx,my,mz(是用户输入的浮点数)和x,y,z(我要计算)。 我首先使用pandas导入了带标题值的excel文件(180,6)。
import pandas as pd
from scipy.optimize import fsolve
# Import Data
data = pd.read_excel('Cylinder.xlsx')
dfObj = pd.DataFrame(data, columns = ['y', 'x', 'Bx', 'By', 'Bz', 'B'])
Bx = dfObj['Bx']
By = dfObj['By']
Bz = dfObj['Bz']
mx = float(input("mx= "))
my = float(input("my= "))
mz = float(input("mz= "))
经过多次尝试和搜索/阅读,我最终根据解决非线性方程组的方式尝试了两种方法。在这两种方法中,我都使用scipy.optimize的fsolve。 在第一个示例中,我定义了方程式,然后初步猜测是使用fsolve(如下面的编解码器),但有一个错误: '''ValueError:用序列设置数组元素。''' '''错误:函数调用的结果不是正确的浮点数组。'
# fsolve functions
def magnetic_field(w):
x = w[0]
y = w[1]
z = w[2]
F = [3]
F.append(0)
F[0] = Bx - (10**-7)*(mx*3*x**2/(x**2+y**2+z**2)**2.5 +
my*3*x*y/(x**2+y**2+z**2)**2.5 + mz*3*x*z/(x**2+y**2+z**2)**2.5 -
mx/(x**2+y**2+z**2)**1.5)
F.append(1)
F[1] = By - (10**-7)*(mx*3*x*y/(x**2+y**2+z**2)**2.5 +
my*3*y**2/(x**2+y**2+z**2)**2.5 + mz*3*y*z/(x**2+y**2+z**2)**2.5 -
my/(x**2+y**2+z**2)**1.5)
F.append(2)
F[2] = Bz - (10**-7)*(mx*3*x*z/(x**2+y**2+z**2)**2.5 +
my*3*y*z/(x**2+y**2+z**2)**2.5 + mz*3*z**2/(x**2+y**2+z**2)**2.5 -
mz/(x**2+y**2+z**2)**1.5)
return F
wGuess = [1,1,1,1]
w = fsolve(magnetic_field,wGuess)
print(w)
print(magnetic_field)
第二次尝试是使用lambda函数,其中错误是: '''TypeError:fsolve:'func'参数''的输入和输出形状不匹配。形状应为(3,)但应为(3,180)。'''
def magnetic_field(f1,f2,f3,x0,y0,z0):
func = lambda x: [f1(x[0], x[1], x[2]), f2(x[0], x[1], x[2]), f3(x[0],
x[1], x[2])]
return fsolve(func,[x0,y0,z0])
f1 = lambda x, y, z : Bx - (10**-7)*(mx*3*x**2/(x**2+y**2+z**2)**2.5 +
my*3*x*y/(x**2+y**2+z**2)**2.5 + mz*3*x*z/(x**2+y**2+z**2)**2.5 -
mx/(x**2+y**2+z**2)**1.5)
f2 = lambda x, y, z : By - (10**-7)*(mx*3*x*y/(x**2+y**2+z**2)**2.5 +
my*3*y**2/(x**2+y**2+z**2)**2.5 + mz*3*y*z/(x**2+y**2+z**2)**2.5 -
my/(x**2+y**2+z**2)**1.5)
f3 = lambda x, y, z : Bz - (10**-7)*(mx*3*x*z/(x**2+y**2+z**2)**2.5 +
my*3*y*z/(x**2+y**2+z**2)**2.5 + mz*3*z**2/(x**2+y**2+z**2)**2.5 -
mz/(x**2+y**2+z**2)**1.5)
res = magnetic_field(f1,f2,f3,1,1,1)
print(res)
我是python的新手,我不理解错误。我在哪里弄错了? 预先感谢。