直接配点法相关的问题

我在看直接配点法的例程,在正是求解之前看到一段代码是这样的(matlab内),实在搞不清楚这个的原理是啥

d=3;
y_base=0;
%get collocation points
% cp1*x^3+cp2*x^2+cp1*x+y_base
tau_root=[y_base collocation_points(d, 'legendre')];
%coefficients of collocation equation
C=zeros(d+1,d+1);
%coes of the continuity equation
D=zeros(d+1,1);
%coes of quadrature(正交,求积,面积) function
B=zeros(d+1,1);
%construct polinomial 看不懂... ...
%遍历多项式参数
for j=1:(d+1)
    %缩放参数?A:不是
    %其实就是因为要乘积,初始值
    coeff=1;
    %再次遍历,这说明是卷积类似的操作0731YH
    for r=1:(d+1)
        if r~=j
            %conv卷积 等于两个多项式相乘后结果的系数
            coeff=conv(coeff, [1, -tau_root(r)]); 
            coeff=coeff/(tau_root(j)-tau_root(r));%1*2
        end
    end
    D(j)=polyval(coeff, 1.0); %系数的和,高次在前 1*1

    pder=polyder(coeff); %多项式微分
    for r=1:(d+1)
        C(j,r)=polyval(pder,tau_root(r));
    end

    pint=polyint(coeff); %多项式积分
    B(j)=polyval(pint, 1.0);
end

以下内容引用自GPT,有用望采纳:

这段代码是用于构建多项式的相关计算和系数的求解。我将逐行解释代码的功能和操作,以帮助您理解。

d=3;
y_base=0;
tau_root=[y_base collocation_points(d, 'legendre')];

在这段代码中,我们首先定义了变量d和y_base。d表示多项式的阶数,y_base是基础值。然后,我们使用函数collocation_points()生成一个包含插值点的向量tau_root,这些点用于构建多项式。

C=zeros(d+1,d+1);
D=zeros(d+1,1);
B=zeros(d+1,1);

这里我们创建了三个矩阵C、D和B,用于存储求解多项式过程中的系数。

for j=1:(d+1)
    coeff=1;
    for r=1:(d+1)
        if r~=j
            coeff=conv(coeff, [1, -tau_root(r)]);
            coeff=coeff/(tau_root(j)-tau_root(r));
        end
    end
    D(j)=polyval(coeff, 1.0);
    
    pder=polyder(coeff);
    for r=1:(d+1)
        C(j,r)=polyval(pder,tau_root(r));
    end
    
    pint=polyint(coeff);
    B(j)=polyval(pint, 1.0);
end

这里是主要的计算部分,使用循环逐个求解多项式的系数。首先,我们以变量j为索引遍历多项式参数。

在每个迭代中,我们首先将初始系数coeff设置为1。然后,我们使用内置函数conv()coeff与多项式 [1, -tau_root(r)] 进行卷积操作,计算多项式相乘得到的结果的系数。我们还根据插值点tau_root(j)tau_root(r)的差值对系数进行缩放。

接下来,我们使用函数polyval()计算在x=1.0处求解多项式的值,并将结果储存在向量D中。

然后,我们使用函数polyder()对多项式进行微分操作,得到多项式的导函数。然后,我们再次遍历插值点,使用函数polyval()计算在每个插值点处导函数的值,并将结果存储在矩阵C中。

最后,我们使用函数polyint()进行多项式的积分操作,得到多项式的原函数。然后,我们再次在x=1.0处使用函数polyval()计算原函数的值,并将结果存储在向量B中。

最终,循环执行完毕后,我们将得到一个包含多项式系数的矩阵C、一个包含多项式值的向量D,以及一个包含多项式的积分值的向量B。

希望这个解释能够帮助您理解这段代码的功能和操作。如果您还有其他问题,请随时提问。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7679118
  • 这篇博客你也可以参考下:基于粒子群优化算法的微型燃气轮机冷热电联供系统优化调度(Matlab代码实现)
  • 您还可以看一下 硬核野生技术咨询客服小李老师的matlab数学建模课程中的 求微分方程组通解特解数值解和求一元二元函数最小值和零点小节, 巩固相关知识点
  • 除此之外, 这篇博客: 通用的改进遗传算法求解带约束的优化问题(MATLAB代码精讲、实际工程经验分享)中的 一、前言 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    在对多约束、非线性问题的求解上,传统线性规划等方法往往无法有效求解(求解时间过长、无法处理非线性约束等。 进化算法是一类强有力的工具,已经在多个领域有了较为成功的应用。然而,在利用遗传算法、粒子群等等进化算法求解实际的优化问题时,还存在许多困难,具体表现为:

    • 1、进化算法难以获得可行解。实际优化问题一般都是超多约束、决策变量类型多样、可行域较小。这种情况下,使用进化算法进行优化求解的情况往往变成,在整个进化过程中,种群都处在不可行域,求解出来的结果也是不可行解,优化失败。或者说,这些迭代过程没有意义。
    • 2、进化算法提前收敛,陷入到局部最优。这是进化算法的通病,毕竟是一类概率搜索算法,不能保证每次都收敛到最优解。对于这个问题,也有很多的研究工作,比如niching、crowding distance之类的。对于基本的遗传算法来说,采用轮盘赌或者竞标赛来选择个体,经常会出现所有种群变成一样的情况,这对于优化求解来说是非常不利的。
    • 3、进化搜索方向不可掌握。对于进化算法来说,每一次的迭代都是选优的过程。我们很难定义不可行解之间的优劣。比较经典的方法就是计算每个个体违反约束的程度或者是违反约束的次数。然后每次挑选违反约束较小的个体进入下一代。由此来产生进化选择的压力。然而,实际问题往往是,某个约束很难被满足,某些约束较容易被满足。比如微电网中电池的充电次数约束很难被满足,充电功率大小较容易被满足。在进化过程中,我们希望个体满足了充电次数约束之后就不要再违反了,因此这个约束满足之后,很大概率就可以找到可行解。但是,通常情况下,满足这个约束之后,下一次迭代,别的约束被满足的更多,因此就把这个个体舍弃了。那么在我们看来,优化向着反方向去了,这对于收敛来说是不好的。
    • 4、代码编写效率低。不知道违反了什么约束,调试起来很费劲。

    博主在对许多文章进行复现之后,针对上面提到的问题也是很难受。为了加快复现进度,同时也是给广大研究工作者总结一般的代码编写套路,因此发布一下我经常使用的单目标进化算法框架以及MATLAB代码。本人的研究主要集中在进化多目标优化领域,对于单目标优化问题只是个人兴趣,如有不当,可友好交流讨论。多目标领域的优化之后也会发布一些文章。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^