过滤 -- 化工原理实验Mathmatica代码

实验代码针对天津大学、重庆理工大学化工原理实验教材设计,若有其他需求,请自行编辑

原始数据记录

序号滤液高/cmp=0.05MPa θ/sp=0.05MPa Δθ/sp=0.10MPa θ/sp=0.10MPa Δθ/sp=0.15MPa θ/sp=0.15MPa Δθ/s
05.00.000.000.000.000.000.00
16.017.6817.6814.6014.609.049.04
27.057.8840.2035.6121.0125.7016.66
38.0117.6459.7664.5328.9148.7423.04
49.0183.4165.7794.7130.1773.9525.21
510.0261.3677.95135.7141.00106.5532.60
611.0359.7098.34183.5847.87141.2834.73
712.0470.81111.11237.5853.99182.1140.83
813.0600.73129.92296.6559.06225.9543.84
914.0857.51256.78381.1284.47280.9555.00
1014.5(第一组为14.5,二三组为15)3521.722664.21813.05431.92401.56120.61

尝试:拿第一组实验数据建立基本流程

(*导入数据*)
importedData = Import[" D : \\ WolframMathmatica \\ 过滤实验数据 . xlsx "];

selectedData1 = importedData[[1, 3 ;; 13, {2, 3, 4}]];
selectedData2 = importedData[[1, 3 ;; 13, {2, 5, 6}]];
selectedData3 = importedData[[1, 3 ;; 13, {2, 7, 8}]]

(*选取数据*)
data = selectedData3;

(*计算 \[CapitalDelta]q*)
a = 0.0475;
deltaV = 9.446*10^-4;
deltaQ = deltaV/a;

(*计算 \[CapitalDelta]\[Theta] 和 \
\[CapitalDelta]\[Theta]/\[CapitalDelta]q*)
deltaThetaList = Differences[data[[All, 2]]];
deltaQList = Table[deltaQ, {Length[deltaThetaList]}];
deltaThetaOverDeltaQList = deltaThetaList/deltaQList;
qList = Prepend[Table[0.05 + i*deltaQ, {i, Length[deltaThetaList]}], 
   0.05];

(*取中点值拟合*)
qToFitList = MovingAverage[qList, 2];
deltaThetaOverDeltaQToFitList = deltaThetaOverDeltaQList;

(*数据配对*)
fitData = Transpose[{qToFitList, deltaThetaOverDeltaQToFitList}];

(*线性拟合*)
fit = LinearModelFit[fitData, x, x];

(*提取斜率和截距*)
kValue = fit["BestFitParameters"][[1]];
qEIntercept = fit["BestFitParameters"][[2]];

(*去掉最后一个数据点并重新进行拟合*)
fitDataWithoutLastPoint = Most[fitData]; 
fitWithoutLastPoint = LinearModelFit[fitDataWithoutLastPoint, x, x];

(*添加自身结尾点确保最右端辅助线边界存在*) 
AppendTo[deltaThetaOverDeltaQList, deltaThetaOverDeltaQList[[-1]]];

(*输出结果*)
Print[fit]
Print["拟合直线斜率:", kValue];
Print["拟合直线截距:", qEIntercept];

Show[
 ListPlot[fitData, PlotStyle -> Red, PlotMarkers -> {Automatic, 5}, 
  AxesLabel -> {"q 值", "\[CapitalDelta]\[Theta]/\[CapitalDelta]q"}, 
  PlotRange -> {{0, 0.30}, All}, Frame -> True,
  PlotLegends -> Placed[{"  Fit Data"}, {Left, Top}]],
 Plot[fit[x], {x, Min[qToFitList], 0.26}, 
  PlotStyle -> {Blue, Thickness[0.003]},
  PlotLegends -> Placed[{"Fit Line"}, {Left, Top}]],
 Plot[fitWithoutLastPoint[x], {x, Min[qToFitList], 0.26}, 
  PlotStyle -> {Green, Thickness[0.003]},
  PlotLegends -> 
   Placed[{"Fit Line Without Last Point"}, {Left, Top}]], 
 Epilog -> {Flatten@
    Table[{{Black, Dashed, 
       Line[{{qList[[i]], 0}, {qList[[i]], 
          deltaThetaOverDeltaQList[[i]]}}]}, {Black, 
       Line[{{qList[[i]], 
          deltaThetaOverDeltaQList[[i]]}, {qList[[i + 1]], 
          deltaThetaOverDeltaQList[[i]]}}]}, {Black, Dashed, 
       Line[{{qList[[i + 1]], 0}, {qList[[i + 1]], 
          deltaThetaOverDeltaQList[[i + 1]]}}]}}, {i, 
      Length[qList] - 1}]}]

尝试:Mathmatica代码效果图

在这里插入图片描述

尝试:输出结果

参数
拟合直线斜率-1245.22
拟合直线截距21846.1

在这里插入图片描述

函数化流程

(*函数:过滤实验拟合*)
FilterFitting[data_List] := 
 Module[{a, deltaV, deltaQ, deltaThetaList, deltaQList, 
   deltaThetaOverDeltaQList, qList, qToFitList, 
   deltaThetaOverDeltaQToFitList, fitData, fit, 
   fitDataWithoutLastPoint, fitWithoutLastPoint, kValue, qEIntercept},
   a = 0.0475;
  deltaV = 9.446*10^-4;
  deltaQ = deltaV/a;
  deltaThetaList = Differences[data[[All, 2]]];
  deltaQList = Table[deltaQ, {Length[deltaThetaList]}];
  deltaThetaOverDeltaQList = deltaThetaList/deltaQList;
  qList = 
   Prepend[Table[0.05 + i*deltaQ, {i, Length[deltaThetaList]}], 
    0.05];
  qToFitList = MovingAverage[qList, 2];
  deltaThetaOverDeltaQToFitList = deltaThetaOverDeltaQList;
  fitData = Transpose[{qToFitList, deltaThetaOverDeltaQToFitList}];
  fit = LinearModelFit[fitData, x, x];
  kValue = fit["BestFitParameters"][[1]];
  qEIntercept = fit["BestFitParameters"][[2]];
  fitDataWithoutLastPoint = Most[fitData];
  fitWithoutLastPoint = 
   LinearModelFit[fitDataWithoutLastPoint, x, x];
  AppendTo[deltaThetaOverDeltaQList, deltaThetaOverDeltaQList[[-1]]];
  {qToFitList, deltaThetaOverDeltaQToFitList, fitData, fit}]

(*函数:过滤实验作图*)
FilterPlot[data_List] := 
 Module[{a, deltaV, deltaQ, deltaThetaList, deltaQList, 
   deltaThetaOverDeltaQList, qList, qToFitList, 
   deltaThetaOverDeltaQToFitList, fitData, fit, 
   fitDataWithoutLastPoint, fitWithoutLastPoint, kValue, qEIntercept, 
   plot}, a = 0.0475;
  deltaV = 9.446*10^-4;
  deltaQ = deltaV/a;
  deltaThetaList = Differences[data[[All, 2]]];
  deltaQList = Table[deltaQ, {Length[deltaThetaList]}];
  deltaThetaOverDeltaQList = deltaThetaList/deltaQList;
  qList = 
   Prepend[Table[0.05 + i*deltaQ, {i, Length[deltaThetaList]}], 
    0.05];
  qToFitList = MovingAverage[qList, 2];
  deltaThetaOverDeltaQToFitList = deltaThetaOverDeltaQList;
  fitData = Transpose[{qToFitList, deltaThetaOverDeltaQToFitList}];
  fit = LinearModelFit[fitData, x, x];
  kValue = fit["BestFitParameters"][[1]];
  qEIntercept = fit["BestFitParameters"][[2]];
  fitDataWithoutLastPoint = Most[fitData];
  fitWithoutLastPoint = 
   LinearModelFit[fitDataWithoutLastPoint, x, x];
  Print[fit];
  Print["拟合直线斜率:", kValue];
  Print["拟合直线截距:", qEIntercept];
  AppendTo[deltaThetaOverDeltaQList, deltaThetaOverDeltaQList[[-1]]];
  plot := 
   Show[ListPlot[fitData, PlotStyle -> Red, 
     PlotMarkers -> {Automatic, 5}, 
     AxesLabel -> {"q 值", "\[CapitalDelta]\[Theta]/\[CapitalDelta]q"},
      PlotRange -> {{0, 0.30}, All}, Frame -> True, 
     PlotLegends -> Placed[{" Fit Data"}, {Left, Top}]], 
    Plot[fit[x], {x, Min[qToFitList], 0.26}, 
     PlotStyle -> {Blue, Thickness[0.003]}, 
     PlotLegends -> Placed[{"Fit Line"}, {Left, Top}]], 
    Plot[fitWithoutLastPoint[x], {x, Min[qToFitList], 0.26}, 
     PlotStyle -> {Green, Thickness[0.003]}, 
     PlotLegends -> 
      Placed[{"Fit Line Without Last Point"}, {Left, Top}]], 
    Epilog -> {Flatten@
       Table[{{Black, Dashed, 
          Line[{{qList[[i]], 0}, {qList[[i]], 
             deltaThetaOverDeltaQList[[i]]}}]}, {Black, 
          Line[{{qList[[i]], 
             deltaThetaOverDeltaQList[[i]]}, {qList[[i + 1]], 
             deltaThetaOverDeltaQList[[i]]}}]}, {Black, Dashed, 
          Line[{{qList[[i + 1]], 0}, {qList[[i + 1]], 
             deltaThetaOverDeltaQList[[i + 1]]}}]}}, {i, 
         Length[qList] - 1}]}];
  plot]

(*导入数据*)
importedData = Import["D:\\WolframMathmatica\\过滤实验数据.xlsx"];
selectedData1 = importedData[[1, 3 ;; 13, {2, 3, 4}]];
selectedData2 = importedData[[1, 3 ;; 13, {2, 5, 6}]];
selectedData3 = importedData[[1, 3 ;; 13, {2, 7, 8}]];
{qToFitList1, deltaThetaOverDeltaQToFitList1, fitData1, fit1} = 
  FilterFitting[selectedData1];
Print["拟合直线:", fit1];
plot1 = FilterPlot[selectedData1]

{qToFitList2, deltaThetaOverDeltaQToFitList2, fitData2, fit2} = 
  FilterFitting[selectedData2];
Print["拟合直线:", fit2];
plot2 = FilterPlot[selectedData2]

{qToFitList3, deltaThetaOverDeltaQToFitList3, fitData3, fit3} = 
  FilterFitting[selectedData3];
Print["拟合直线:", fit3];
plot3 = FilterPlot[selectedData3]

函数化流程:Mathmatica代码效果图

在这里插入图片描述

函数化流程:输出结果

拟合直线斜率拟合直线截距
-41471.396036.

在这里插入图片描述

拟合直线斜率拟合直线截距
-6054.8767879.6

在这里插入图片描述

拟合直线斜率拟合直线截距
-1245.2221846.1

在这里插入图片描述

函数功能去重

Clear["Global`*"]

FilterfitLineting[selectedData_List] :=
 Module[
  {a, deltaV, deltaQ, deltaThetaList, deltaQList, 
   deltaThetaOverDeltaQList, qList, qMeanTofitLineList, 
   deltaThetaOverDeltaqMeanTofitLineList, fitCoordinates, fitLine, 
   fitCoordinatesWithoutLastPoint, fitLineWithoutLastPoint, kValue, 
   qEIntercept}, a = 0.0475;
  deltaV = 9.446*10^-4;
  deltaQ = deltaV/a;
  deltaThetaList = Differences[selectedData[[All, 2]]];
  deltaQList = Table[deltaQ, {Length[deltaThetaList]}];
  deltaThetaOverDeltaQList = deltaThetaList/deltaQList;
  qList = 
   Prepend[Table[0.05 + i*deltaQ, {i, Length[deltaThetaList]}], 
    0.05];
  qMeanTofitLineList = MovingAverage[qList, 2];
  deltaThetaOverDeltaqMeanTofitLineList = deltaThetaOverDeltaQList;
  fitCoordinates = 
   Transpose[{qMeanTofitLineList, 
     deltaThetaOverDeltaqMeanTofitLineList}];
  fitLine = LinearModelFit[fitCoordinates, x, x];
  kValue = fitLine["BestFitParameters"][[1]];
  qEIntercept = fitLine["BestFitParameters"][[2]];
  fitCoordinatesWithoutLastPoint = Most[fitCoordinates];
  fitLineWithoutLastPoint = 
   LinearModelFit[fitCoordinatesWithoutLastPoint, x, x];
  AppendTo[deltaThetaOverDeltaQList, deltaThetaOverDeltaQList[[-1]]];
  {a, deltaV, deltaQ, deltaThetaList, deltaQList, 
   deltaThetaOverDeltaQList, qList, qMeanTofitLineList, 
   deltaThetaOverDeltaqMeanTofitLineList, fitCoordinates, fitLine, 
   fitCoordinatesWithoutLastPoint, fitLineWithoutLastPoint, kValue, 
   qEIntercept}]
FilterPlot[selectedData_List, fitCoordinates_, fitLine_, 
  fitLineWithoutLastPoint_, qMeanTofitLineList_] :=
 Module[
  {plot},
  plot = 
   Show[ListPlot[fitCoordinates, PlotStyle -> Red, 
     PlotMarkers -> {Automatic, 5}, 
     AxesLabel -> {"q 值", "\[CapitalDelta]\[Theta]/\[CapitalDelta]q"},
      PlotRange -> {{0, 0.30}, All}, Frame -> True, 
     PlotLegends -> Placed[{" fitLine selectedData"}, {Left, Top}]], 
    Plot[fitLine[x], {x, Min[qMeanTofitLineList], 0.26}, 
     PlotStyle -> {Blue, Thickness[0.003]}, 
     PlotLegends -> Placed[{"fitLine Line"}, {Left, Top}]], 
    Plot[fitLineWithoutLastPoint[x], {x, Min[qMeanTofitLineList], 
      0.26}, PlotStyle -> {Green, Thickness[0.003]}, 
     PlotLegends -> 
      Placed[{"fitLine Line Without Last Point"}, {Left, Top}]], 
    Epilog -> {Flatten@
       Table[{{Black, Dashed, 
          Line[{{qList[[i]], 0}, {qList[[i]], 
             deltaThetaOverDeltaQList[[i]]}}]}, {Black, 
          Line[{{qList[[i]], 
             deltaThetaOverDeltaQList[[i]]}, {qList[[i + 1]], 
             deltaThetaOverDeltaQList[[i]]}}]}, {Black, Dashed, 
          Line[{{qList[[i + 1]], 0}, {qList[[i + 1]], 
             deltaThetaOverDeltaQList[[i + 1]]}}]}}, {i, 
         Length[qList] - 1}]}];
  Print[fitLine];
  Print["拟合直线斜率:", fitLine["BestFitParameters"][[1]]];
  Print["拟合直线截距:", fitLine["BestFitParameters"][[2]]];
  {plot}]

importedData = Import["D:\\WolframMathmatica\\过滤实验数据.xlsx"];
plots = {};
Do[
 selectedData = importedData[[1, 3 ;; 13, {2, 3 + 2 i, 4 + 2 i}]];
 {a, deltaV, deltaQ, deltaThetaList, deltaQList, 
   deltaThetaOverDeltaQList, qList, qMeanTofitLineList, 
   deltaThetaOverDeltaqMeanTofitLineList, fitCoordinates, fitLine, 
   fitCoordinatesWithoutLastPoint, fitLineWithoutLastPoint, kValue, 
   qEIntercept} = FilterfitLineting[selectedData];
 plot = FilterPlot[selectedData, fitCoordinates, fitLine, 
   fitLineWithoutLastPoint, qMeanTofitLineList];
 AppendTo[plots, plot];, {i, 0, 2}
 ]
plots

函数功能去重:Mathmatica代码效果图

在这里插入图片描述

函数功能去重:输出结果

拟合直线斜率拟合直线截距
-41471.396036.

在这里插入图片描述

拟合直线斜率拟合直线截距
-6054.8767879.6

在这里插入图片描述

拟合直线斜率拟合直线截距
-1245.2221846.1

在这里插入图片描述
需要注意的是,若尝试在同一坐标轴下展示所有图形,可能报错

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

向阳a非࿐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值