用正交多项式作最小二乘拟合

用正交多项式作最小二乘拟合最近在做数值分析大作业 用到了正交多项式曲线拟合 不调用 MATLAB 曲线拟合的函数实现 下面分享给大家 由于本人水平有限代码仅供参考 大佬勿喷

用正交多项式作最小二乘拟合

最近在做数值分析大作业,用到了正交多项式曲线拟合,不调用MATLAB曲线拟合的函数实现,下面分享给大家,由于本人水平有限代码仅供参考,大佬勿喷。

一、正交多项式作最小二乘拟合原理

参考清华大学的数值分析第五版教材,以下三张图片为本文用到的部分

二、实现代码

首先是数据导入,我的原始数据是6*2的矩阵,存放在Excel表格中 ,注意n要小于数据点的个数。

clc clear all format long g %改变精度 data=xlsread('sn.xls'); %导入数据 Smax=data(:,1); N=data(:,2); n=6; %正交多项 

下面是具体实现方法,主要是for循环。在求P时由于建立n个符号函数再计算,过于麻烦所以我将其拆分成两个部分,先建立一个nm的矩阵存放P0到Pk在原始点处的值,由此计算出完整的α,β和a,再建立一个元胞数组,根据计算出的α和β得出P0到Pk关于x的表达式,最后求出y并画出图形。

plot(Smax,N,'bp'); %画点 hold on syms x1 %构建符号变量 m=numel(Smax); %计算原始数据的长度 P=zeros(n,m); %构建矩阵用于存放原始点处P的值,里面是double类型数据为了方便计算a a=zeros(n,1); %用于存放α b=zeros(n,1); %用于存放β q=zeros(n,1); %用于存放a p=cell(n,1); %构建元胞数组用于存放P(里面是符号表达式) p{ 
   1}=1; %将P0赋值为1 y=0; %y为最终表达式 w=0; %我为计算误差的中间值 for i=1:m %首先将P的第一行赋值为1 P(1,i)=1; end for k=2:n %根据公式计算α,β a(k)=sum(Smax'.*P(k-1,:).^2)/sum(P(k-1,:).*P(k-1,:)); if k>2 b(k)=sum(P(k-1,:).^2)./sum(P(k-2,:).^2); end for i=1:m %计算在数据点处P的值 if k>2 P(k,i)=(Smax(i)-a(k)).*P(k-1,i)-b(k).*P(k-2,i); else P(k,i)=(Smax(i)-a(k)).*P(k-1,i); end end end for k=1:n %计算a* q(k)=sum(N'.*P(k,:))/sum(P(k,:).^2); end for k=2:n %根据α,β和a求出P0到Pk的表达式 if k>2 p{ 
   k}=(x1-a(k))*p{ 
   k-1}-b(k)*p{ 
   k-2}; else p{ 
   k}=(x1-a(k))*p{ 
   k-1}; end end for k=1:n %得出最终的拟合函数表达式 y=y+q(k)*p{ 
   k}; end fplot(y,[200,500]) %画图 for k=1:n %计算平方误差中间值w w=w+sum(P(k,:).*P(k,:)).*(q(k).^2); end wucha3=sum(N.^2)-w %计算平方误差 xlabel('最大应力Smax'); ylabel('循环寿命N(10^6)次'); title('用正交多项式拟作最小二乘拟合'); legend('dot','拟合曲线'); %添加注释,增加可读性 grid on ; hold off 

CSDN没有MATLAB的代码格式我设置的c的格式看的清晰一点

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/220676.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午7:54
下一篇 2026年3月17日 下午7:54


相关推荐

  • flex弹性盒子布局(详细)

    flex弹性盒子布局(详细)弹性盒模型 1 伸缩容器 displayFlex 是 FlexibleBox 的缩写 意为 弹性布局 用来为盒状模型提供最大的灵活性 任何一个容器都可以指定为 Flex 布局 采用 Flex 布局的元素 称为 Flex 容器 flexcontaine 简称 容器 它的所有子元素自动成为容器成员 称为 Flex 项目 flexitem 简称 项目 容器默认存在两根轴 水平的主轴 mainaxis 和垂直的交叉轴 crossaxis 主轴的开始位置 与边框的交叉点 叫做 m

    2026年3月17日
    2
  • 深入浅出的讲解傅里叶变换(真正的通俗易懂)「建议收藏」

    深入浅出的讲解傅里叶变换(真正的通俗易懂)「建议收藏」我保证这篇文章和你以前看过的所有文章都不同,这是12年还在果壳的时候写的,但是当时没有来得及写完就出国了……于是拖了两年,嗯,我是拖延症患者……  这篇文章的核心思想就是:  要让读者在不看任何数学公式的情况下理解傅里叶分析。  傅里叶分析不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多大一新生上来就懵圈并从此对

    2022年7月17日
    20
  • C语言二维数组作为函数参数传递

    C语言二维数组作为函数参数传递二维数组存放方式二维数组在内存中是按行存放的 先存储第一行 在接着存储第二行 二维数组作为函数参数二维数组作为函数的参数 实参可以直接使用二维数组名 在被调用函数中可以定义形参所有维数的大小 也可以省略以为大小的说明 例如 voidfind chara 3 10 voidfind chara 10 也可以使用数组指针来作为函数参数 例如

    2026年3月18日
    2
  • 保姆级图文指南!2026年1分钟部署OpenClaw(Clawdbot)+Top20核心Skill精选

    保姆级图文指南!2026年1分钟部署OpenClaw(Clawdbot)+Top20核心Skill精选

    2026年3月13日
    4
  • django分页器的用法_MySQL实现数据分页

    django分页器的用法_MySQL实现数据分页前言当后台返回的数据过多时,我们就要配置分页器,比如一页最多只能展示10条等等,drf中默认配置了3个分页面PageNumberPagination:基础分页器,性能略差LimitOffsetP

    2022年7月30日
    11
  • ZYNQ跑系统 系列(二) petalinux方式移植linux[通俗易懂]

    ZYNQ跑系统 系列(二) petalinux方式移植linux[通俗易懂]移植linux之petalinux之前一篇博文中,提到了一种通用的传统移植方式,将linux移植到ZYNQ中的ARM芯片中。本文将针对xilinx的专用开发环境petalinux,进行安装、入门和开发

    2025年10月31日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号