-1

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

编辑:所以从下面的评论中,是的,我试过查看 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的文件,所以它似乎没用。

我读过这个:有人可以解释函数 mkpp 和 ppval 的行为吗? 但是,它仍然没有解释 matlab 在幕后做什么,它只是解释它与常规多项式不同。

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

如果有人可以帮助解析所使用的术语的含义,那就太好了

4

1 回答 1

1

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

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

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
于 2013-08-22T10:15:13.210 回答