在Matlab中计算积分

时间:2019-03-19 17:33:56

标签: matlab

我得到以下数据:

Data

我被要求计算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)

但这没用。

3 个答案:

答案 0 :(得分:2)

使用MATLAB中的 cumtrapz 函数。

T = [...]
Cp=[...]
CpdivT = Cp./T
I = cumtrapz(T, CpdivT)

您可以在https://www.mathworks.com/help/matlab/ref/cumtrapz.html

上了解有关该功能的更多信息。

答案 1 :(得分:2)

使用interp1integral使用简单的原始设置的简单方法。
如果需要,将仅使用更复杂的数值技术。您可以检查'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

documentation

图形代码:

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
请注意,trapzcumtrapz都需要单位间距;要使用这些参数,首先需要对单位间隔进行插值。


相关帖子 :(答案已完成后找到)
Graphic show impact of interpolation method choice
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