apple_73920293 2022-10-03 15:47 采纳率: 0%
浏览 28
已结题

我利用matlab2018a进行卷积和反卷积计算参数PD和△t,但是拟合效果并不好,是我代码的问题吗?

img

img


clc
clear
close all
% 读取
tbl = readtable('浓度变化.xlsx', 'ReadVariableNames', false, 'ReadRowNames', true, 'DatetimeType', 'datetime');
time = tbl{'时间',:};
Cin  = tbl{'Cin',:};
Cout = tbl{'Cout',:};
% 对齐时间
time = (time-time(1)).*24.*60;
newtime = linspace(time(1),time(end),50*numel(time));
% 插值
Cin  = interp1(time, Cin,newtime);
Cout = interp1(time,Cout,newtime);
time = newtime;
% 穷举可能的参数
Pd = exp(linspace(log(5),log(180),100));
dt = linspace(3500,120000,100);
[Pd, dt] = meshgrid(Pd, dt);
sse = zeros(size(Pd));
for i = 1:size(Pd,1)
   for j = 1:size(Pd,2)
       sse(i,j) = objective([Pd(i,j), dt(i,j)], time, Cin, Cout);
   end
   i
end
% 画出xyz图(x: pd, y: dt, z: 误差平方和)
s = surf(Pd, dt, sse, 'EdgeColor', 'none');
view(2);
% 目标函数,误差平方和最小化
function sse = objective(coeff, time, Cin, Cout)
    Pd = coeff(1);
    dt = coeff(2);
    pred = predict(time, Cin, Pd, dt); % 用模型公式预测Cout值
    sse = pred-Cout; % 差分找误差平方和
    sse = sse*sse';
end
function Cout = predict(time, Cin, Pd, dt) % 预测
    gval = g(time, Pd, dt); % 权重函数
    gval(1) = gval(2);
    Cout = zeros(size(Cin));
    for i = 2:numel(time) % 遍历每个时刻t求Cout(t)
        v = gval(1:i).*Cin(i:-1:1); % 求被积函数在0到t的值
        v(2:end-1) = v(2:end-1).*2; % 复化梯形公式求积分值
        Cout(i) = sum(v)./2.*time(i)./(i-1); % 复化梯形公式求积分值
    end
end
function val = g(T, Pd, dt) % 按公式定义
    sig = sqrt(2.*Pd.*T./dt);
    val = 1./T.*normpdf(T./dt, 1, sig);
end

  • 写回答

1条回答 默认 最新

  • 喜爱cpp 2022-10-05 22:45
    关注

    您好,你给的测试的excel表格,我看有一个数据有问题(14点的cout数值,小数点位数太多了)。

    评论

    报告相同问题?

    问题事件

    • 系统已结题 10月11日
    • 创建了问题 10月3日

    悬赏问题

    • ¥100 webapi的部署(标签-服务器)
    • ¥20 怎么加快手机软件内部计时的时间(关键词-日期时间)
    • ¥15 C语言除0问题的检测方法
    • ¥15 为什么四分管的内径有的是16mm有的15mm,四分不应该是12.7mm吗
    • ¥15 macos13下 ios交叉编译的问题
    • ¥15 bgz压缩文件怎么打开
    • ¥15 封装dll(引入了pcl的点云设计库)
    • ¥30 关于#开发语言#的问题:我需要在抄板的基础上再抄板抄程序,根据RDA8851CM基础上开发
    • ¥15 oracle 多个括号,怎么删除指定的括号及里面的内容?
    • ¥15 小新14API2019想用bios调风扇