代码已出,最速下降法参数拟合,求改
<p></p><p>tic</p><p>clc;clear;<br/>syms x1 x2 x3 x4<br/>t=;<br/>p=;<br/>i=;<br/>for m=1:8<br/> for n=1:9<br/>F(m,n)=(x1.*(1+x2.*log(p(m,1)))/(t(1,n)+x3).^x4-i(m,n)).^2;<br/> end<br/>end<br/>Q=sum(sum(F))<br/>dQ1=diff(Q,x1);dQ2=diff(Q,x2);dQ3=diff(Q,x3);dQ4=diff(Q,x4);%对函数进行求一阶导<br/>DQ=;<br/>dQ11=diff(dQ1,x1);dQ12=diff(dQ1,x2);dQ13=diff(dQ1,x3);dQ14=diff(dQ1,x4);<br/>dQ21=diff(dQ2,x1);dQ22=diff(dQ2,x2);dQ23=diff(dQ2,x3);dQ24=diff(dQ2,x4);<br/>dQ31=diff(dQ3,x1);dQ32=diff(dQ3,x2);dQ33=diff(dQ3,x3);dQ34=diff(dQ3,x4);<br/>dQ41=diff(dQ4,x1);dQ42=diff(dQ4,x2);dQ43=diff(dQ4,x3);dQ44=diff(dQ4,x4);<br/>%这里进行求函数二阶导数<br/>DQQ=;<br/>%海赛矩阵<br/>disp('x1 x2 x3 x4 分别代表 A c b n 取初值')<br/>x=input('请输入x1 x2 x3 x4的初始值为x=,x=:');<br/>x=x';<br/>%矩阵转置<br/>E=input('请输入你所要求的最速下降法的精度数E=:');<br/>%这里进行一些相关初始值的计算<br/>T=[];<br/>d=T;<br/>TH=[];<br/>%给d,t赋空矩阵<br/>T(:,1)=subs(DQ,,)<br/>% T(:,1)指数组的第一列 res=subs(es,old,new)用new置换es中的old后产生res<br/>TH=subs(DQQ,,)<br/>GG(1)=subs(Q,,)<br/>%这里进行一些相关初始值的计算<br/>disp('由于你输入的初始值,这里将开始最速下降法搜寻:');<br/>% 显示内容<br/>for k=1:1000<br/> d(:,1)=-T(:,1) %d(k)是x(k+1)=x(k)+R(k)*d(k)<br/> %d(k)为计算搜索方向即负梯度方向<br/> R(1)=(T(:,1)'*T(:,1))/(T(:,1)'*TH*T(:,1))<br/> %R(k)为近似最佳步长<br/> TH=subs(DQQ,,)<br/> T(:,k)=subs(DQ,,)<br/> d(:,k+1)=-T(:,k)<br/> R(k)=(T(:,k)'*T(:,k))/(T(:,k)'*TH*T(:,k))<br/> GG(k)=subs(Q,,)<br/> %while k>=2<br/> %while GG(k)>=GG(k-1)<br/> % R(k)=R(k)/2;<br/> %end<br/> % end<br/> if norm(T(:,k))<E %norm() 范-2误差<br/> disp(' ');<br/> disp('QX就是最速下降法的解 ')<br/> QX=subs(Q,,)<br/> disp(' ');<br/> disp('对应的x值为 ');<br/> x(:,k)<br/> break;<br/> end<br/> x(:,k+1)=x(:,k)+R(k)*d(:,k)<br/><br/>end<br/>
<br/>toc</p><p>给为兄弟姐妹,谁知道我编的这个哪里错了啊?</p><p>TH=subs(DQQ,,) 这句运行起来时间非常长。</p><p>有谁知道我这应该怎么改啊,希望好心人帮忙一下</p> {:3_50:}{:3_50:}{:3_50:}
页:
[1]