我得到以下数据:
我被要求计算Cp / T dT的积分,从113.7到264.4。
我不确定应该如何解决。如果要使用积分命令,则需要一个函数,但是我不知道在这种情况下函数应该如何。
我尝试过:
library(dplyr)
Test2 <- function(df, kk) {
xx1 <- group_by_at(mtcars, vars(mpg, cyl, kk)) %>%
summarise(FreqOG = length(cyl))
xx1 <- data.frame(xx1)
}
yy1 <- Test2(mtcars,hp)
但这没用。
答案 0 :(得分:2)
使用MATLAB中的 cumtrapz 函数。
T = [...]
Cp=[...]
CpdivT = Cp./T
I = cumtrapz(T, CpdivT)
上了解有关该功能的更多信息。
答案 1 :(得分:2)
使用interp1
和integral
使用简单的原始设置的简单方法。
如果需要,将仅使用更复杂的数值技术。您可以检查'RelTol'
的{{3}}中的'AbsTol'
和integral
选项。
数值积分:(带有线性插值)
% MATLAB R2017a
T = [15 20 30 40 50 70 90 110 130 140 160 180 200 220 240 260 270 275 285 298]';
Cp = [5.32 10.54 21.05 30.75 37.15 49.04 59.91 70.04 101.59 103.05 106.78 ...
110.88 114.35 118.70 124.31 129.70 88.56 90.07 93.05 96.82]';
fh =@(t) interp1(T,Cp./T,t,'linear');
t1 = 113.7;
t2 = 264.4;
integral(fh,t1,t2)
ans = 91.9954
替代插值方法:
您的结果将取决于您的插值方法(请参见下面的代码和图形)。
% Results depend on method of interpolation
Linear = integral(@(t) interp1(T,Cp./T,tTgts,'linear'),t1,t2) % = 91.9954
Spline = integral(@(t) interp1(T,Cp./T,tTgts,'spline'),t1,t2) % = 92.5332
Cubic = integral(@(t) interp1(T,Cp./T,tTgts,'pchip'),t1,t2) % = 92.0383
图形代码:
tTgts = T(1):.01:T(end);
figure, hold on, box on
p(1) = plot(tTgts,interp1(T,Cp./T,tTgts,'linear'),'b-','DisplayName','Linear')
p(2) = plot(tTgts,interp1(T,Cp./T,tTgts,'spline'),'r-','DisplayName','Spline')
p(3) = plot(tTgts,interp1(T,Cp./T,tTgts,'pchip'),'g-','DisplayName','Cubic')
p(4) = plot(T,Cp./T,'ks','DisplayName','Data')
xlim([floor(t1) ceil(t2)])
legend('show')
% Cosmetics
xlabel('T')
ylabel('Cp/T')
for k = 1:4, p(k).LineWidth = 2; end
近似值较差:(以获得大致的数量级估计)
tspace = T(2:end)-T(1:end-1);
midpt = mean([Cp(1:end-1) Cp(2:end)],2);
sum(midpt.*tspace)./sum(tspace)
您会看到我们在球场上(至少让我感到更舒服)。
其他可行的MATLAB函数: quadgk
| quad
% interpolation method affects answer if using `interp1()`
quadgk(@(t) interp1(T,Cp./T,t,'linear'),t1,t2)
quad(@(t) interp1(T,Cp./T,t,'linear'),t1,t2)
需要更多工作的功能: trapz
| cumtrapz
请注意,trapz
和cumtrapz
都需要单位间距;要使用这些参数,首先需要对单位间隔进行插值。
相关帖子 :(答案已完成后找到)
Matlab numerical integration
答案 2 :(得分:0)
这可能更适合您的问题。请注意,我假设二阶多项式非常适合您的数据。如果拟合效果不理想,您可能希望获得更好的模型结构。
% Data
T = [15 20 30 40 50 70 90 110 130 140 160 180 200 220 240 260 270 275 285 298];
Cp = [5.32 10.54 21.05 30.75 37.15 49.04 59.91 70.04 101.59 103.05 106.78 110.88 114.35 118.70 124.31 129.70 88.56 90.07 93.05 96.82];
% Fit function using 2nd order polynomial
f = fit(T',Cp'./T','poly2');
% Compare fit to actual data
plot(f,T,Cp./T)
% Create symbolic function
syms x
func = f.p1*x*x + f.p2*x + f.p3;
% Integrate function
I = int(func,113.7,264.4);
% Convert solution from symbolic to numeric value
V = double(I);
结果为92.7839