shoney 发表于 2009-9-15 10:27:38

大家帮忙看看这个求最优参数的程序问题在哪儿?

本帖最后由 shoney 于 2009-9-15 10:40 编辑

是一个根据实验i数据求最优扩散系数的问题,即有一种物质扩散入一个圆柱体内,实验测得各个时间点的浓度,方程是一个PDE方程。运行结果没提示错误,但结果就是不对,最优的Deff值老是等于初值,不知道问题出在哪儿。(附件是源程序)。程序如下:

function ACdisc_Diffusion
clear all;clc;
global Cm;
%动力学数据
tlist=;    %测量的时间点,单位min
Cm=;    %测得的AC中DMSO平均浓度,单位%w/w

%非线性拟合
C0=0;
Deff0=0.0116;    %单位mm2/min
=lsqnonlin(@OptObjFunc,Deff0,[],[],[],tlist,C0,Cm)
ci=nlparci(Deff,resid,jacobian)

%--------------------------------------------------------------------------
%求解PDE
function C=OptObjFunc(Deff,tlist,C0,Cm)   
%PDE问题定义及参数初始化
g='ACdiscg1';    %定义求解域,几何尺寸单位mm
b='ACdiscb1';    %定义边界条件
d=['x/' num2str(Deff)];c='x';a=0;f=0;    %方程的系数

%网格化(三角形网格划分及网格细化)
=initmesh(g);
=refinemesh(g,p,e,t);
=refinemesh(g,p,e,t);
p=jigglemesh(p,e,t);

%绘制PDE三角形网格
pdemesh(p,e,t);

u=parabolic(C0,tlist,b,p,e,t,c,a,f,d);    %计算得到的AC中任意时间任意位置DMSO浓度
%积分求解DMSO平均浓度的计算值
xi=linspace(0,3,100);yi=linspace(0,0.38,100);
Cc2(1,1)=0;    %赋值0,因进行网格转化时,值由线性插值得到;结果Cc2(1,1)≠0(边界值=9.04)
for i=2:length(tlist)
    Cc{1,i}=tri2grid(p,t,u(:,i),xi,yi);    %各个时间点分别进行网格转化
    Cc0=Cc{1,i};
    Cc1(1,i)=dblquad(@Func,0,3,0,0.38,[],@quadl,xi,yi,Cc0);    %积分求各个时间点对应的总浓度
    Cc2(1,i)=Cc1(1,i)/(3*0.38);    %平均浓度
end
C=Cc2-Cm;    %残差
   
%--------------------------------------------------------------------------
function f=Func(x,y,xi,yi,Cc0)
f=interp2(xi,yi,Cc0,x,y);

运行结果如下:
Optimization terminated: first-order optimality less than OPTIONS.TolFun,
and no negative/zero curvature detected in trust region model.
Deff =

    0.0116


resnorm =

    2.7230


resid =

         0   -1.0917   -0.7775    0.4317    0.6481    0.5194    0.2249    0.0000


exitflag =

   1


output =

    firstorderopt: 0
       iterations: 0
      funcCount: 2
   cgiterations: 0
      algorithm: 'large-scale: trust-region reflective Newton'
          message:


lambda =

    lower: 0
    upper: 0


jacobian =

   All zero sparse: 8-by-1


ci =

1.0e+007 *

   -9.8973    9.8973

messenger 发表于 2009-9-15 11:26:48

觉得这句d=['x/' num2str(Deff)];有问题。另外,你这个问题最好分开算,先解方程,然后再拟合。

TBE_Legend 发表于 2009-9-15 17:46:20

觉得这句d=['x/' num2str(Deff)];有问题。另外,你这个问题最好分开算,先解方程,然后再拟合。
messenger 发表于 2009-9-15 11:26 http://forum.simwe.com/images/common/back.gif

一直就很讨厌MATLAB的这种符号计算的表达方式,很别扭、生涩。

建议用comsol来做你的问题,matlab自带的那个pde tool差太多了。

shoney 发表于 2009-9-15 23:27:20

觉得这句d=['x/' num2str(Deff)];有问题。另外,你这个问题最好分开算,先解方程,然后再拟合。
messenger 发表于 2009-9-15 11:26 http://forum.simwe.com/images/common/back.gif这句没有问题,确定。因为单独解PDE时(Deff用估计值,含这句)没有问题

shoney 发表于 2009-9-15 23:31:17

觉得这句d=['x/' num2str(Deff)];有问题。另外,你这个问题最好分开算,先解方程,然后再拟合。
messenger 发表于 2009-9-15 11:26 http://forum.simwe.com/images/common/back.gif按照您“分开算”的方法,我试了一下,自己一个一个的带入Deff值,然后比较残差平方和,在Deff=0.0122时,得到最小的残差平方和。但是当我把这个Deff值打入这个程序的时候,结果还是不对,郁闷啊……自己感觉lsqnonlin()这个函数也没用错啊

huchengyao7890 发表于 2009-9-16 12:33:50

本帖最后由 huchengyao7890 于 2009-9-16 12:35 编辑

function ACdisc_Diffusion2
clear all;clc;
global y1;
t2=;
y1=;

beta0=;
=lsqnonlin(@fun446,beta0,[],[],[],t2,y1)
% --------------------------------------------------------------
function F=fun446(beta,t2,y1)

m = 0;
x = ;
t = ;

sol = pdepe(m,@pdex5pde,@pdex5ic,@pdex5bc,x,t);
u1 = sol(:,:,1);
u2 = sol(:,:,2);


nt = length(t2);
iok = 2:nt;
for j = iok
= pdeval(m,x,u2(j,:),0);
end
F=I+beta(1)+beta(2).*t2-y1;

% --------------------------------------------------------------
function = pdex5pde(x,t,u,DuDx)
c = ;                                 
f = .* DuDx;                  
y = u(1) - u(2);
F = exp(5.73*y)-exp(-11.47*y);
s = [-F; F];                                                         
% --------------------------------------------------------------
function u0 = pdex5ic(x);
u0 = ;                                 
% --------------------------------------------------------------
function = pdex5bc(xl,ul,xr,ur,t)
pl = ;                              
ql = ;                                 
pr = ;                           
qr = ;   
谁帮我看看我的问题啊,我是直接用pdepe求解的一维偏微分方程的,可是好像无法计算,帮帮我吧,一运行总说Error using ==> beta
Not enough input arguments.,可是我两个参数,两个初始值,没有问题啊。

huchengyao7890 发表于 2009-9-16 15:34:45

我向老师请教过,我估计是你的参数根本就没有传递给你的偏微分方程,你只是写到系数里,可是求解偏微分方程的程序里并没有传递这个参数进去,不知道我说的对不对啊?

shoney 发表于 2009-9-16 15:58:24

我向老师请教过,我估计是你的参数根本就没有传递给你的偏微分方程,你只是写到系数里,可是求解偏微分方程的程序里并没有传递这个参数进去,不知道我说的对不对啊?
huchengyao7890 发表于 2009-9-16 15:34 http://forum.simwe.com/images/common/back.gif"可是求解偏微分方程的程序里并没有传递这个参数进去"这个怎么理解呢?Deff在PDE方程的系数里,那计算PDE的时候肯定是包含进了Deff啊?
页: [1]
查看完整版本: 大家帮忙看看这个求最优参数的程序问题在哪儿?