2015-06-24 41 views
0

我试图使用scipy Optimize fsolve函数来查找使用COM对象定义的函数的零。Python&SciPy - 使用fsolve与COM连接

首先,我创建了COM对象:

import win32com.client 
os = win32com.client.Dispatch("PX32.OpenServer.1") 

此COM对象的工作为一个程序,我输入变量,然后进行计算,并获得结果的界面,使用setvaluedocommandgetvalue方法/功能。

如果我这样定义一个函数:

def fn(x): 
    os.setvalue("INPUT_VAR_STRING", x) 
    os.docommand("COMMAND_STRING") 
    return float(os.getvalue("RESULT_STRING")) 

通过改变输入值(通过x传入fn),我得到不同的输出值:

fn(100) 
> 18.139818203 
fn(190) 
> -40.93182830 

但是,如果我尝试使用fsolve找到fn函数的根,我得到一个错误:

from scipy.optimize import fsolve 
fsolve(fn,150) 
> TypeError 
> (...) 
> TypeError: Internal error - the buffer length is not the sequence length! 

这是什么意思?我该如何尝试解决已经出现的这个错误?

回答

1

我发现了这个问题。根据http://kitchingroup.cheme.cmu.edu/pycse/pycse.html

12.11 Using an external solver with Aspen (...)

flashT = float(flashT) # COM objects do not understand numpy types

这是主要的东西。我不得不改变

os.setvalue("INPUT_VAR_STRING", x)

os.setvalue("INPUT_VAR_STRING", float(x))得到预期的结果。