目的:非线性拟合求得函数后,计算特定y值对应的x值。
第一步:曲线拟合
调用函数代码
function diff=F4P(p,d,pd)
dmin=0.07
diff=100*(1./((log(exp(1)+(p(1)./d).^p(2))).^p(3))).*(1-(log(1+p(4)./d)./log(1+p(4)./dmin)).^7)
曲线拟合代码
[NUM]=xlsread('Skempton ABCD',3,'A1:CE2')
d=NUM(1,:)
pd=NUM(2,:)
p0=[1 2 0.5 0.001]
p=lsqcurvefit(@F4P,p0,d,pd)
dmin=0.07
pdnew=100*(1./((log(exp(1)+(p(1)./d).^p(2))).^p(3))).*(1-(log(1+p(4)./d)./log(1+p(4)./dmin)).^7)
semilogx(d,pd,'-or',d,pdnew,'b')
第二步:求因变量y值对应的x值
求单独一个点时,初值选取合适,即可得到结果。
f=@(d)100*(1./((log(exp(1)+(p(1)./d).^p(2))).^p(3))).*(1-(log(1+p(4)./d)./log(1+p(4)./dmin)).^7)-20
x=fzero(f,1.2)
求一系列y值时,只有一部分有解,其他的结果显示Nan(无解)
y=1:1:30
for i=1:numel(y)
f=@(d)100*(1./((log(exp(1)+(p(1)./d).^p(2))).^p(3))).*(1-(log(1+p(4)./d)./log(1+p(4)./dmin)).^7)-y(i)
x(i)=fzero(f,1)
end
计算结果见附图x0=1; 如果将代码中初值改为0.1,即 x(i)=fzero(f,1)改为 x(i)=fzero(f,0.1),计算结果见附图x0=0.1
问题1:由此可见,fzero是在x0的一定范围内求解的,那么这个范围是多少呢?能否将搜索范围变大。
问题2:如果我想求得y=1:1:30所有对应的解,该如何修改代码?我尝试了以下命令,但报错
y=1:1:30
x0=[0.1 2]
for i=1:numel(y)
f=@(d)100*(1./((log(exp(1)+(p(1)./d).^p(2))).^p(3))).*(1-(log(1+p(4)./d)./log(1+p(4)./dmin)).^7)-y(i)
x(i)=fzero(f,x0)
end
(1)报错为The function values at the interval endpoints must differ in sign. 意思是说f(0.1)和f(2)的值必须一个正数,一个负数么?
(2)我改成x0=[-0.1 2],又提示Function values at interval endpoints must be finite and real.
(3)那么请问我该怎么修改代码,才能实现我的目的呀(y=1:1:30所有对应的解)?
问题3:如果将fzero命令改为fsolve命令,就能得到y=1:1:30所有对应的解,且初值不需要为区间。fzero是求解一元非线性方程组的,fsolve是用来求解多元非线性方程组。似乎fsolve比fzero的命令强大不少,那么fzero存在的意义是什么,fsolve也可以求解一元非线性方程呀?
x0=0.1.jpg
(22.13 KB, 下载次数: 0)
2015-2-10 06:29 上传
x0=1.jpg
(21 KB, 下载次数: 0)
2015-2-10 06:29 上传
2015-2-10 06:30 上传
点击文件名下载附件
19.76 KB, 下载次数: 18