将matlab mkpp转换为python

时间:2013-08-20 08:19:21

标签: python matlab math

我正在尝试将一些matlab代码转换为python并运行到matlab的mkpp函数中。我在python中使用scipy阅读了很多不同的插值内容,但是我无法理解如何模仿matlab代码的功能。我尝试在scipy中使用interpolate.PiecewisePolynomial,但它似乎没有采用相同的参数,在matlab中是断点和系数。 matlab实际上有什么来源吗?如何在python中模仿mkpp的功能?

编辑: 所以从下面的评论中,是的,我已经尝试过查看mkpp文件,

if nargin==2, d = 1; else d = d(:).'; end
dlk=numel(coefs); l=length(breaks)-1; dl=prod(d)*l; k=fix(dlk/dl+100*eps);
if (k<=0)||(dl*k~=dlk)
   error(message('MATLAB:mkpp:PPNumberMismatchCoeffs',...
       int2str(l),int2str(d),int2str(dlk)))
end

pp.form = 'pp';
pp.breaks = reshape(breaks,1,l+1);
pp.coefs = reshape(coefs,dl,k);
pp.pieces = l;
pp.order = k;
pp.dim = d;

文件说的是什么,我找不到pp的任何文件,所以它似乎没用。

我已经读完了这个:Can someone explain the behavior of the functions mkpp and ppval?但是,它仍然没有解释matlab在幕后做什么,它只是解释它与常规多项式不同。

我甚至开始弄明白的问题是我为scipy找到的所有内容都与mkpp有不同的参数。我已经编写了python代码来创建coefs和break,但scipy文档http://docs.scipy.org/doc/scipy/reference/generated/scipy.interpolate.PiecewisePolynomial.html#scipy.interpolate.PiecewisePolynomial甚至没有以相同的方式引用变量,这使得它非常混乱。

如果有人可以帮助解析这个术语是什么意思

,那就太好了

1 个答案:

答案 0 :(得分:1)

对于任何有兴趣的人,这是我的困惑,这就是我现在理解的方式。 pp实际上不是一个函数,而是对定义多项式的结构的调用。 mkpp只是创建多项式的组件,然后可以与ppval或样条或任何其他分析方法一起使用。为了模仿这个,我创建了以下代码,这是一个正在进行的工作,但应该对它如何工作提出一个好主意:

首先,我使用一个类来定义多项式

class PiecePoly():
    """
    A class to mimick the MATLAB struct piecewise polynomial (pp)
    """
    def __init__(self):
        form = 'pp'
        breaks = []
        coefs = []
        pieces = 0
        order = 0
        dim = 0

然后函数mkpp是:

def mkpp(breaks,coefs,*args):
    """
    Takes in the breaks, coefs, and optionally (d) then creates a pp from the 
    PiecePoly class and constructs the polynomial
    Returns: the constructed polynomial
    """
    if len(args)==1:
        d = np.transpose(args[0])
    else:
        d = 1
    sum=0
    try:
        #Just make sure coefs is not a 4D matrix
        for i in range(len(coefs)):
            for j in range(len(coefs[i])):
                sum = sum+len(coefs[i][j])
    except:
        #First try to count a 2D coefs array this should be the one that works
        try:
            for i in range(len(coefs)):
                sum = sum+len(coefs[i])
        #Coefs must be 1 dimensional
        except:
            sum = len(coefs)

    dlk = sum
    l = len(breaks)-1

    try:
        if len(d) > 1:
            prod = 0
            for i in range(len(d)):
                prod = prod*d[i]
            dl = prod*l
        else:
            dl = d*l
    except:
        dl = d*l

    k = dlk/dl+100*(math.pow(2,-52))
    if k<0:
        k = math.ceil(k)
    else:
        k = math.floor(k)

    if k<=0 or (dl*k!=dlk):
        print "ERROR: MISMATCH PP AND COEF"
        return None

    pp = PiecePoly()
    pp.form = 'pp'
    pp.breaks = np.reshape(breaks,1,l+1)
    pp.coefs = np.reshape(coefs,dl,k)
    pp.order = k
    pp.dim = d

    return pp