Matlab如何以曲线的形式连接连个点?Matlab绘制卡诺循环曲线

Matlab如何以曲线的形式连接连个点?

若已知两个点的坐标,通过插值拟合的方法可以实现曲线连接的效果。

以卡诺循环图为例:

在这里插入图片描述
若已知a,b,c,d的坐标,想要实现下图中的精确结果:
在这里插入图片描述
则仅需在坐标a与b,b与c,c与d,d与a之间,先分别插入一个坐标点(可以自己按网格线估算),然后通过拟合函数以曲线的形式连接四个点:

Demo1

clc,clear,close all;
%a——c
x_ab = [1,1.25,1.6];
y_ab = [1,0.8,0.625];
x_bc = [1.6,1.8,2.24];
y_bc = [0.625,0.5,0.358];
%interp1三次样条插值
xq_ab = linspace(1,1.6,100);  %100个点密度
vq_ab = interp1(x_ab,y_ab,xq_ab,'spline');
plot(xq_ab,vq_ab,"LineWidth",2);
hold on
xq_bc = linspace(1.6,2.24,100);
vq_bc = interp1(x_bc,y_bc,xq_bc,'spline');
plot(xq_bc,vq_bc,'g--',"LineWidth",2);
%c——a
x_ad = [1,1.15,1.4];
y_ad = [1,0.8,0.572];
x_dc = [1.4,1.6,2.24];
y_dc = [0.572,0.5,0.358];
%interp1三次样条插值
xq_ad = linspace(1,1.4,100);  %100个点密度
vq_ad = interp1(x_ad,y_ad,xq_ad,'spline');
plot(xq_ad,vq_ad,'c-',"LineWidth",2);
xq_dc = linspace(1.4,2.24,100);
vq_dc = interp1(x_dc,y_dc,xq_dc,'spline');
plot(xq_dc,vq_dc,'r-.',"LineWidth",2);
grid on
axis([0 2.5 0 1])
 
%贴abcd标签
text(1.02,1,'a','FontSize',15)
text(1.63,0.625,'b','FontSize',15)
text(2.27,0.358,'c','FontSize',15)
text(1.43,0.572,'d','FontSize',15)
 
stem(1,1,'k--')
%表示(0,1)(1,1)之间有水平连线,以此类推画出其他水平横线
line([0 1],[1,1],'LineStyle','--','Color','k')
stem(1.6,0.625,'k--')
line([0 1.6],[0.625,0.625],'LineStyle','--','Color','k')  
stem(1.4,0.572,'k--')
line([0 1.4],[0.572,0.572],'LineStyle','--','Color','k')
stem(2.24,0.358,'k--')
line([0 2.24],[0.358,0.358],'LineStyle','--','Color','k') 
 
%贴刻度标签
text(0,1,'1','FontSize',13)
text(0,0.625,'0.625','FontSize',13)
text(0,0.358,'0.358','FontSize',13)
text(0,0.572,'0.572','FontSize',13)
 
text(1,0,'1','FontSize',13)
text(1.4,0,'1.4','FontSize',13)
text(1.6,0,'1.6','FontSize',13)
text(2.24,0,'2.24','FontSize',13)
 
%图例
legend("等温过程T_1/T_a=1","绝热过程","绝热过程","等温过程T_2/T_a=0.8")
title("卡诺循环图")
xlabel("体积V/V_a")
ylabel("压强P/P_a")

效果:
在这里插入图片描述

Demo2

clc,clear,close all;
%a——c
x_dc = [0.544,0.6,0.871];
y_dc = [2.76,2.5,1.72];
x_cb = [0.871,0.95,1.6];
y_cb = [1.72,1.5,0.625];
%interp1三次样条插值
xq_dc = linspace(0.544,0.871,100);  %100个点密度
vq_dc = interp1(x_dc,y_dc,xq_dc,'spline');
plot(xq_dc,vq_dc,'r-.',"LineWidth",2);
hold on
xq_cb = linspace(0.871,1.6,100);
vq_cb = interp1(x_cb,y_cb,xq_cb,'spline');
plot(xq_cb,vq_cb,'g--',"LineWidth",2);
%c——a
x_da = [0.544,0.68,1];
y_da = [2.76,2,1];
x_ab = [1,1.2,1.6];
y_ab = [1,0.8,0.625];
%interp1三次样条插值
xq_da = linspace(0.544,1,100);  %100个点密度
vq_da = interp1(x_da,y_da,xq_da,'spline');
plot(xq_da,vq_da,'c-',"LineWidth",2);
xq_ab = linspace(1,1.6,100);
vq_ab = interp1(x_ab,y_ab,xq_ab,'spline');
plot(xq_ab,vq_ab,'b',"LineWidth",2);
grid on
axis([0 1.6 0 3])
 
%贴abdc标签
text(1.02,1,'a','FontSize',15)
text(1.61,0.625,'b','FontSize',15)
text(0.892,1.72,'c','FontSize',15)
text(0.564,2.76,'d','FontSize',15)
 
stem(0.544,2.76,'k--')
%表示(0,1)(1,1)之间有水平连线,以此类推画出其他水平横线
line([0 0.544],[2.76,2.76],'LineStyle','--','Color','k')
stem(0.871,1.72,'k--')
line([0 0.871],[1.72,1.72],'LineStyle','--','Color','k')  
stem(1,1,'k--')
line([0 1],[1,1],'LineStyle','--','Color','k')
stem(1.6,0.625,'k--')
line([0 1.6],[0.625,0.625],'LineStyle','--','Color','k') 
% 
%贴刻度标签
text(0,2.76,'2.76','FontSize',13)
text(0,1.72,'1.72','FontSize',13)
text(0,1,'1','FontSize',13)
text(0,0.625,'0.625','FontSize',13)
 
text(0.544,0,'0.544','FontSize',13)
text(0.871,0,'0.871','FontSize',13)
text(1,0,'1','FontSize',13)
text(1.6,0,'1.6','FontSize',13)
 
%图例
legend("等温过程T_2/T_a=1.5","绝热过程","绝热过程","等温过程T_1/T_a=1")
title("卡诺循环图")
xlabel("体积V/V_a")
ylabel("压强P/P_a")

效果:
在这里插入图片描述

Matlab插值拟合

以上两个demo中插值拟合的方法用到的是interp1函数,在我以前的博客笔记中介绍过:

interp1函数简单插值、拟合方法

在这里插入图片描述
答:

clc,clear,close all;
x = linspace(-2,2,10);
y = exp(-x.^2);
figure(1)
stem(x,y,"LineWidth",1.5)
grid on
title('f(x)')
%interp1线性插值
xq = linspace(-2,2,20);
vq1 = interp1(x,y,xq);
figure(2)
plot(x,y,'o',xq,vq1,':.',"LineWidth",1.5);
xlim([-2 2]);
grid on
title('interp1线性插值');
%polyfit多项式拟合插值
p = polyfit(x,y,7);
y1 = polyval(p,x);
figure(3)
plot(x,y,'g-o',"LineWidth",1.5)
hold on
plot(x,y1,"LineWidth",1.5)
hold off
xlim([-2 2]);
grid on
title('polyfit多项式拟合插值');
%spline三次样条插值
yy = spline(x,y,xq);
figure(4)
plot(x,y,'o',xq,yy,"LineWidth",1.5)
xlim([-2 2]);
grid on
title('spline三次样条插值');

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
需要注意的是,interp1的插值方式可选择多种,默认是线性插值,画出来的可能还是直线或折线,卡诺循环图的demo里选择的是spline,详情见官方文档:interp1在这里插入图片描述
可以尝试更换为其他方式,拟合出来的效果也不尽相同,当然也可以直接通过spline()函数实现。

除此之外,插值、曲线拟合的方法还有多项式拟合、最小二乘法等,感兴趣的同学可以课下钻研尝试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wayne_Fine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值