分类目录归档:Matlab

COMSOL Matlab livelink多参数研究仿真 2

model = mphopen('1113.mph'); %打开文件

param_name = ["d1" "a3" "a2" "a1"]; % 参数名称
param_unit = ["um" "um" "um" "um"]; % 参数单位
param_Value = [0.1 0.3 0.5;...  %参数值
                50 75 100;...
                1 3 5;...
                0.1 1 2];

% For循环运行所有参数组
para_num=size(param_Value,2);
T_max=zeros(para_num^4,1);
Stress1=zeros(para_num^4,1);
Stress2=zeros(para_num^4,1);
para=ones(para_num^4,4);
i=1;
for para1=1:para_num % 循环研究参数名
    for para2=1:para_num
        for  para3=1:para_num
            for para4=1:para_num
                %记录输出
                tic;
                fprintf('Start simulation %d: %s=%.1f | %s=%.1f | %s=%.1f | %s=%.1f \n',i,...
                    param_name(1),param_Value(1,para1),...
                    param_name(2),param_Value(2,para2),...
                    param_name(3),param_Value(3,para3),...
                    param_name(4),param_Value(4,para4));
                %设定参数
                model.param.set(param_name(1),num2str(param_Value(1,para1)),param_unit(1));
                model.param.set(param_name(2),num2str(param_Value(2,para2)),param_unit(2));
                model.param.set(param_name(3),num2str(param_Value(3,para3)),param_unit(3));
                model.param.set(param_name(4),num2str(param_Value(4,para4)),param_unit(4));
                %运行计算
                model.sol('sol1').runAll;
                model.sol('sol2').runAll;
                model.sol('sol3').runAll;
                %记录数据
                para(i,:)=[param_Value(1,para1) param_Value(2,para2) param_Value(3,para3) param_Value(4,para4)];
                T_max(i) = mphglobal(model,'dom1','dataset','dset1','unit','degC'); %导出指定数据集的探针数据
                Stress1(i) = mphglobal(model,'dom2','dataset','dset3','unit','MPa');
                Stress2(i) = mphglobal(model,'dom6','dataset','dset4','unit','MPa');
                fprintf('Done simulation %d: T_max = %.2f | Stress1 = %.2f | Stress2 = %.2f\n',i,T_max(i),Stress1(i),Stress2(i));
                i=i+1;
                toc
            end
        end
    end
end
save('data.mat','para','T_max','Stress1','Stress2');

COMSOL Matlablive 多参数研究,批量化运行+导出+自动整理

COMSOL软件的研究求解模块其实提供了比较丰富的参数化运行结构,但是对不同参数的研究的结果导出方面,还是需要很多手动设置操作的才能导出批量化数据。

比如以下情况:研究对线是一个催化反应器,需要入口温度、入口流速、反应器尺寸、反应物初始孔隙率等四个不同的输入参数进行单变量的不同输入值的影响研究。那么如果直接使用COMSOL来做的话,就需要使用参数化扫描对单个参数进行扫描,然后导出动画进行分解,并保存四个不同的mph文件,用于分别研究四个参数。

针对这种情况,其实可以用Matlab livelink来进行批量的单个参数的修改,并运行求解导出相关结果(mph、图、报告、表数据)。

% 1、定义要运行的参数组
model = mphopen('param_run.mph');  % 打开模型
% 设定参数组
param_name = ["T_in" "U_in" "d_ball" "eps_init"]; % 参数名称
param_unit = ["degC" "m/s" "um" ""]; % 参数单位
param_Value = [600 650 700 750 800;...  %参数值
                0.1 0.2 0.3 0.4 0.5;...
                75 150 200 300 500;...
                0.03 0.05 0.1 0.15 0.2];

% 2、 For循环运行所有参数组
for name=1:length(param_name) % 循环研究参数名
   for value=1:size(param_Value,2) % 参数水平
       % 记录输出
       tic;
       fprintf('Start simulation: %s=%s [%s]\n',param_name(name),num2str(param_Value(name,value)),param_unit(name));
       % 设定参数
       model.param.set(param_name(name),num2str(param_Value(name,value)),param_unit(name));
       % 运行计算
       model.sol('sol1').runAll;
       % 导出数据
       model.result.report('rpt1').run; % 导出报告
       model.result.export('anim1').run; % 导出动画
       model.result.export('anim2').run;
       model.result.export('anim3').run;
       model.result.export('anim4').run;
       model.result.export('anim5').run;
       model.result.export('anim6').run;
       model.result.export('anim7').run;
       model.result.export('plot1').run; % 导出出图数据表
       model.result.export('plot2').run;
       model.result.export('plot3').run;
       % 整理导出数据
       movefile("export_dir", strcat(param_name(name),"_", num2str(param_Value(name,value))));
       copyfile("export_file",strcat(param_name(name),"_", num2str(param_Value(name,value))));
       % 完成
       toc
   end
   % 设定回原参数
   model.param.set(param_name(name),num2str(param_Value(name,1)),param_unit(name));
end

【Matlab】Matlab插值函数

当我们需要利用Matlab对某些二维表格进行插值函数的输入的时候,类似将下表的数据,编辑成一个插值函数的的时候。

代码如下:

function R_out = ROEM (T_in,SOC_in) % T_in, SOC_in分别为插值T、SOC数据
%% 输入待插值表格数据 t、soc、R
t=[273.15	288.15	298.15	308.15	318.15];
soc = [1 0.8	0.6	0.4	0.2	0.1	0];
R = [37.47	22.88	24.74	26.42	32.71	56.83	98.76;
26.15	18.02	13.85	12.76	16.32	43.76	72.5;
11.21	9.43	7.24	7.63	8.34	15.21	38.90;
10.08	8.78	6.78	7.29	10.21	16.15	33.22;
9.02	7.88	6.31	6.66	7.53	13.49	29.76];
%% 对T、SOC进行数据网格化
[SOC,T]=meshgrid(soc,t);
%% 展示出图
% surf(SOC,T,R);
%% 对输入数据进行插值
% T_in = 275;SOC_in = 0.5;
R_out=interp2(SOC,T,R,SOC_in,T_in,'linear');
end

COMSOL内调用 Matlab函数

在COMSOL中内部环境提供了很多函数类型,可以对边界条件、初始值进行很多定制操作了。但是对于一些多维函数关系,COMSOL自带的函数功能就会有些不够用,此时Matlab的对数据处理的优越能力就体现出来了,我们可以在Matlab环境中构建好一些函数关系,然后直接在COMSOL环境中进行调用。

Matlab函数的输入需要注意以下几点:

1、在运行前,需要提前配置好COMSOL Matlab Livelink环境,并提前打开Matlablivk环境,并将需要添加的函数所在的文件夹,添加到Matlab的工作路径;

2、添加Matab函数后,添加Matlab函数定义里同样的函数名,变量名;同时设定好变量的上下限,导数相关设置可以不填写;

3、需要在“首选项”中允许MATLAB函数;

注意以上三点,即可完成Matlab函数的调用~!


Matlab 对csv数据持续写入的方式

Matlab计算的数据保存有很多种方式,可以直接试用xlswrite函数讲数据保存成,也可以用csvwrite写成csv。

但是在你如果在某些循环计算中持续生成数据后然后实时写入csv中,dlmwrite函数是个比较好的方式。比以上两种方式速度快非常多,可以大量优化for循环效率。

dlmwrite('data.csv',data,'delimiter',',','-append');