士郎小天使 2021-12-15 13:20 采纳率: 81.1%
浏览 105
已结题

MATLAB用polyfit求出来的多项式,如何直接对其进行积分后再算polyval

就是一组数据,先用histogram算出频率分布,用多项式拟合,polyfit算出多项式的参数值,然后对多项式进行积分后,之后再带入数据求值。下面是我的代码,是用syms定义后,先进行积分,之后再带入数据算;但是这种方法,多项式n的阶数一多,到30多阶级,慢慢编写就会很麻烦,而且会频繁变更阶数,有没有什么办法能快速对算出来的多项式进行积分,再求值。
或者有什么办法把我的syms下面的int简化下(for循环能用在syms里面吗),而不是这种一个一个把函数写出来,

clc
clear;
X=xlsread('Berthold.xlsx')
X=X(:,1);
H=histogram(X,'Normalization','probability');
n=2;%多项式阶数
x = (H.BinEdges(1:end-1)+H.BinEdges(2:end))/2;
y = H.Values; 
p = polyfit(x,y,n);
f1 = polyval(p,x);%直接求的值
syms z
f2=int(p(:,1)*z.^2+p(:,2)*z+p(:,3))
subs(f2,z,x)%对多项式积分后的值

  • 写回答

2条回答 默认 最新

  • 王向杰 2021-12-17 01:54
    关注

    这个应该避免符号运算,直接根据定积分的那个定义来求。(好像不能用markwdown来写公式。。。)
    就是说,如果把积分上下限a和b分成M份,然后用求和的方式来得到积分的值,如果M足够大,那对于每一小份,不论取区间中哪一点的函数值,最终结果都应该一样。比如说,对于x_i和x_(i+1)这一个区间,不论你用f(x_i)还是f(x_(i+1))来求这一小段的面积,对最终的计算结果影响都不大。
    假设你的表达式是f(x),积分上下限是a 和b; error_int是你想实现的精度
    Matlab code:
    error_int=1e-6;
    err=10;
    M=1000;
    while err > error_int
    x=[a:(b-a)/M:b];
    y=f(x); % 这一步就是生成对应的函数值,如果是符号,好像得用eval这种
    int_result=sum(y(2:end)) *(b-a)/M;
    err=abs(sum(y(2:end))-sum(y(1:end-1))) (b-a)/M; % 不知道为啥 乘号显示不出来
    M=M
    10; % M=M乘以10 不知道为啥 乘号显示不出来
    end

    评论 编辑记录
    1人已打赏

报告相同问题?

问题事件

  • 系统已结题 12月23日
  • 修改了问题 12月15日
  • 创建了问题 12月15日

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示