24小时热门版块排行榜    

查看: 546  |  回复: 2

wlx0914

金虫 (小有名气)

[交流] 【求助】fminsearchi求解参数问题

已知数据T,xx, xb, 想要把xx表示成以下方程:
lnxx=a+b/T+c*lnT+d*xb+e*xb^2+f*xb^3;
根据数据求方程参数a到e,
目标函数为sum((T-TCAL).^2)最小,TCAL为计算值
自己编的程序有错,请高手指教

function y=myfun()
clear all
clc
ExpData =[292.15        0.00848105        0.200113301
296.09        0.009329695        0.200113301
300.09        0.010580997        0.200113301
304.09        0.011993794        0.200113301
308.29        0.013486483        0.200113301
312.49        0.015286746        0.200113301
316.9        0.017209812        0.2001133
321.39        0.019224455        0.200113301
325.59        0.021446333        0.2001133
329.89        0.023818241        0.200113301
334.13        0.026117718        0.200113301
338.08        0.028576812        0.200113301
341.98        0.031254491        0.200113301
345.86        0.033917449        0.200113301
292.15        0.016489969        0.399943158
297.09        0.017925164        0.399943158
300.79        0.019553686        0.399943158
305.09        0.0215646        0.399943158
309.99        0.024057562        0.399943158
314.39        0.026586429        0.399943158
318.29        0.029056351        0.399943158
322.49        0.03187043        0.399943157
326.69        0.035019471        0.399943158
330.92        0.038027106        0.399943158
335.29        0.041484872        0.399943158
340.5        0.045715199        0.399943158
344.8        0.04958667        0.399943157
348.09        0.052760705        0.399943158
];
T1= ExpData(:,1);
xx1= ExpData(:,2);
xb1= ExpData(:,3);
T=T1';xx=xx1';xb=xb1';
%用fminsearch()—求解非线性Nelder-Mead单纯形法(非线性数据拟合)问题
A0= [-76.4362523947615          1917.34072551572          11.5199849169552        0.0858354183915545          2.96421571145088         -1.90592987130477
];
options=optimset('MaxFunEvals',1e+008,'MaxIter',1e+008)
A=fminsearch(@obj,A0,options,T,xx,xb)


function f =Eqs(T,A,xx,xb)     % 模型方程
f=xx-exp(A(1)+A(2)./T+A(3).*log(T)+A(4).*xb+A(5).*xb.^2+A(6).*xb.^3);

function f=obj(A,T,xx,xb)      %目标函数方程
n=length(T);
for i=1:n
   x=fzero(@Eqs,T(i),[],xx(i),xb(i),A(1),A(2),A(3),A(4),A(5),A(6));
    Tcal(i)=x;
end
f=sum((T-TCAL).^2)
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lidaxue

木虫 (正式写手)

之乎者也

这是运行楼主的程序产生的错误信息
??? Error using ==> fzero at 317
FZERO cannot continue because user supplied function_handle ==> Eqs
failed with the error below.

Too many input arguments.

Error in ==> obj at 4
   x=fzero(@Eqs,T(i),[],xx(i),xb(i),A(1),A(2),A(3),A(4),A(5),A(6));

Error in ==> fminsearch at 205
fv(:,1) = funfcn(x,varargin{:});

Error in ==> myfun at 39
A=fminsearch(@obj,A0,options,T,xx,xb)
Comeon!
2楼2010-11-10 17:17:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lidaxue

木虫 (正式写手)

之乎者也


robert2020(金币+1):多谢虫友提供建议。 2010-11-10 23:00:11
其实楼主这个程序 完全可以换一种方式来进行编写,这种跨函数间的调用很容易产生错误的,建议吧原始数据输入作为一个m文件,然后利用fminsearch进行单纯形拟合,在拟合过程中进行函数值的求解,这样m文件总共只有两个。
Comeon!
3楼2010-11-10 17:31:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 wlx0914 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见