yynyjc 2021-11-16 16:55 采纳率: 100%
浏览 128
已结题

用MATLAB对一组磁滞曲线数据进行拟合

这个是实验册上面的实验数据

img

下面第一段是我的拉格朗日函数m文件

function y=lagrange(x0,y0,x)
n=length(x0);m=length(x);
for i=1:m
    z=x(i);
    s=0.0;
    for k=1:n
        p=1.0;
        for j=1:n
            if j~=k
                p = p*(z-x0(j))/(x0(k)-x0(j));
            end
        end
        s=p*y0(k)+s;
    end
    y(i)=s;
end

**接下来是命令行,对这些实验数据进行拟合,但是发现得到的曲线不对,不知道错在哪里了

x0 = [0.2,0.3,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.05,1.1,1.15,1.2,1.25,1.3,1.35,1.4,1.45];
y0 = [38,58,65,74,85,92,98,108,116,125,135,145,156,168,185,208,244,292,355,405,620,850,1200,1620];
x = linspace(0.2,1.45,24);

y1 = lagrange(x0,y0,x);
plot(x,y1,'g')
hold on 
plot(x0,y0,'*')

img

不知道是什么问题,更接触这个软件,还望各位朋友帮忙看看更正一下,谢谢!!

  • 写回答

1条回答 默认 最新

  • 技术专家团-Joel 2021-11-16 17:05
    关注

    你好,你给出的代码是拉格朗日(Lagrange)插值的代码,不是拟合的代码,拟合建议用polyfit函数,因为你如果用拉格朗日多项式插值的话,虽然可以保证多项式经过每一个点,但是当插值点个数过多的话,会出现龙格现象,即在插值点外的点的数值结果发生振荡,也即你所给的图像显示的曲线。
    现为你更正如下(弃用lagrange函数)

    x0 = [0.2,0.3,0.4,0.45,0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.05,1.1,1.15,1.2,1.25,1.3,1.35,1.4,1.45];
    y0 = [38,58,65,74,85,92,98,108,116,125,135,145,156,168,185,208,244,292,355,405,620,850,1200,1620];
    x = linspace(0.2,1.45,24);
    p = polyfit(x0,y0,5); %5次多项式插值得到多项式系数 (经过检查5次效果比较好)
    y1 = polyval(p,x);%根据多项式系数得到插值的值y1
    plot(x,y1,'g')
    hold on 
    plot(x0,y0,'*')
    

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月25日
  • 已采纳回答 11月17日
  • 创建了问题 11月16日

悬赏问题

  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵