Python-用fsolve解决三个非线性方程-错误

时间:2018-11-22 18:26:31

标签: python-3.x

我必须用三个方程来解决一个非线性问题。等式的变量是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的新手,我不理解错误。我在哪里弄错了? 预先感谢。

0 个答案:

没有答案