matlab 实现散点曲线拟合+拟合函数的获取+绘制曲线的上下顶点的切线

一 多项式拟合,数据分布相对光滑的情况,更想要的是数据的整体分布趋势,对于单个数据点的准确度要求不高

n =5;
%polyfit 返回值p从左到右是高次到低次的多项式p(x)的系数,长度是n+1
%p(x) = p1 * x(n次方) + p2 * x(n-1次方)+ 。。。 + pn * x + pn+1
p = polyfit(x,y,n); 
f1 = polyval(p,x);   
% plot(x,f1,'r-');

%获得多项式的方程
syms m
for k  =1:n+1
    var(k) = m ^(k -1);
end
func = flip(var) .* p;
f = sum(func);
m = min(x):max(x);
scatter(x,y,'o');hold on;
handles1 = plot(m,subs(f));hold on;

%找曲线的最大最小值,即曲线的上下顶点
result = subs(f);
max_f = max(result(:));
min_f = min(result(:));
line( [min(x),max(x)],[max_f,max_f],'linestyle','--');hold on;  %画顶点线
line( [min(x),max(x)],[min_f,min_f],'linestyle','-');hold on;  %画顶点线
pause(2);

%cla reset;这个语句可以实现figure图像的清空
%vap(x)将分数转换为小数

推荐网址,比较全面 https://blog.csdn.net/zengxiantao1994/article/details/77943305

在这里插入图片描述

n =3;
x = new_HU_data;
y_w = new_WATER_data;
%polyfit 返回值p从左到右是高次到低次的多项式p(x)的系数,长度是n+1
%p(x) = p1 * x(n次方) + p2 * x(n-1次方)+ 。。。 + pn * x + pn+1
p = polyfit(x,y_w,n); 
Funtion_w = polyval(p,x);   %%%%% funtion, input x, don't change p, get new Y

二 每个数据点都不能丢失,要想连接所有的数据点

    x = [1.0000    1.5000    2.0000    3.0000    4.0000    5.0000    6.0000    8.0000   10.0000   15.0000   20.0000 30.0000   40.0000   50.0000   60.0000   80.0000  100.0000  150.0000];
    y = [1.5700    0.5355    0.3092    3.1920    2.7770    0.9784    0.4529    0.2450    0.1470    0.0647    0.0339 0.0103    0.0045    0.0014    0.0007    0.0004    0.0003    0.0002];
    xx = x(1):1:x(end);
    yy = spline(x,y,xx);
    plot(x,y,'o',xx,yy);

在这里插入图片描述

3 . 绘制没有数据的网格

figure(1);
axis([0 500 1 500])
grid

在这里插入图片描述

三 x出现重复数据,也就是一个x对应两个y的时候,要拟合数据获取数据点,可以从重复的地方分成前后两段

filename = xlsread("GOS_μ_μen.xlsx");
energy = filename(:,1)*1000;
M_GOS_nist = filename(:,3);
Men_GOS_nist = filename(:,5);

%GOS
fp6 = fopen('GOSMassAttn.dat','rb');
DensityGOS = fread(fp6,1,'float32');
EnergyNum6 = fread(fp6,1,'int');
Energy6 = fread(fp6,EnergyNum6,'float32');
M_Gos = fread(fp6,EnergyNum6,'float32');
fclose(fp6);


x = energy(32:43);  %from 10kev to 150kev
y = M_GOS_nist(32:43);
[fitresult,~] = createFit(x(1:7),y(1:7));
xx1 = 10:50;  yy1 = fitresult(xx1);
[fitresult,~] = createFit(x(8:end),y(8:end));
xx2 = 50:150;  yy2 = fitresult(xx2);

figure(2);hold on;
plot(xx1,yy1','o');
plot(xx2,yy2','*');
plot(10:150,M_Gos(10:150),'k-.');

如果您有一组数据点,并希望使用Matlab进行线性拟合绘制散点图拟合线,可以按照以下步骤操作: 1. 创建数据点 首先,您需要创建一组包含x和y值的数据点。您可以手动创建这些数据点,也可以从文件或其他源中读取数据。 例如,以下代码创建了一个包含10个数据点的向量: ```matlab x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; y = [2.5, 4.7, 5.1, 6.4, 7.2, 8.6, 9.7, 11.3, 12.1, 13.9]; ``` 2. 绘制散点图 接下来,您可以使用Matlab的plot函数绘制散点图。这将在图形窗口中显示数据点。 ```matlab plot(x, y, 'o'); ``` 这将绘制所有数据点,每个点用“o”表示。 3. 进行线性拟合 要进行线性拟合,您可以使用Matlab的polyfit函数。这将返回一个包含拟合系数的向量。 ```matlab p = polyfit(x, y, 1); ``` 此代码将执行一个一次多项式拟合,并将拟合系数存储在向量“p”中。p(1)是拟合直线的斜率,p(2)是截距。 4. 绘制拟合线 最后,您可以使用Matlab的plot函数绘制拟合线。这将在散点图绘制一条直线。 ```matlab hold on; plot(x, p(1)*x+p(2), '-'); ``` 此代码将在散点图绘制一条直线,该直线是通过拟合直线计算的。该“ hold on”命令确保直线绘制散点图之上。 完整代码如下: ```matlab x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; y = [2.5, 4.7, 5.1, 6.4, 7.2, 8.6, 9.7, 11.3, 12.1, 13.9]; plot(x, y, 'o'); p = polyfit(x, y, 1); hold on; plot(x, p(1)*x+p(2), '-'); ``` 这将生成一个包含散点图拟合线的图形。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值