matlab 非线性最小二乘法程序,请大侠帮我修改,编个正确的程序,非常感谢
就是下面这个公式Wq=b*Np/(R-N)N是累积产油量(对应x值)W是N值对应下的累积产水量(对应的tdata);已知N和W的一组对应的数据,求q、b、P、R四个未知数...
就是下面这个公式
Wq=b*Np/(R-N)
N是累积产油量(对应x值)
W是N值对应下的累积产水量(对应的tdata);
已知N和W的一组对应的数据,求q、b、P、R四个未知数。
数据在后面,因为字数限制,只粘贴上了部分数据;
我急需这个程序,谢谢大侠帮忙
下面是我编写的文件,运算不下去
m文件:
function f=curvefun1(a,x);
f=((a(1).*x.^a(2))/(a(3)-x)).^(1/a(4));
输入命令
%a(1)=b;a(2)=p;a(3)=R;a(4)=q;
tdata=xlsread('cumwater','sheet1','A1:GJ1');
x=xlsread('cumoil','sheet1','A1:GJ1');
a0 = [0,0,0,0];
a = lsqcurvefit('curvefun1', a0, x, tdata);
f=curvefun1(a,x);
运行后出错
Error using lsqcurvefit (line 247)
Function value and YDATA sizes areincommensurate.
Error in sample1 (line 6)
a = lsqcurvefit('curvefun1', a0, x, tdata);
以下是对应的数据:
cumoil cumwater
66875.41 58977.89
67735.27 60461
68702.61 62111.58
69707.74 63778.53
70700.54 65502.97
71779.68 67433.32
72888.27 69551.3
73835.36 71377.45
74872.23 73369.16
75873.16 75029.27
76682.89 76438.22
77623.03 78030.04
78662.82 79861.07
79639.4 81524.4
80732.68 83373.33
81768.37 84971.66
82819.92 86584.91
83853.85 88167.91
84879.57 89706.48
85845.71 91149.57
86272.45 91733.81
86631.99 92420.38
87457.44 94050.57
88392.46 95877.68
89303.52 97558.14
90172.87 99446.22
91127.56 101512.4
92031.94 103342.9
92841.83 105022.1
请帮忙者注意: 公式中的p和q都是指数。 展开
Wq=b*Np/(R-N)
N是累积产油量(对应x值)
W是N值对应下的累积产水量(对应的tdata);
已知N和W的一组对应的数据,求q、b、P、R四个未知数。
数据在后面,因为字数限制,只粘贴上了部分数据;
我急需这个程序,谢谢大侠帮忙
下面是我编写的文件,运算不下去
m文件:
function f=curvefun1(a,x);
f=((a(1).*x.^a(2))/(a(3)-x)).^(1/a(4));
输入命令
%a(1)=b;a(2)=p;a(3)=R;a(4)=q;
tdata=xlsread('cumwater','sheet1','A1:GJ1');
x=xlsread('cumoil','sheet1','A1:GJ1');
a0 = [0,0,0,0];
a = lsqcurvefit('curvefun1', a0, x, tdata);
f=curvefun1(a,x);
运行后出错
Error using lsqcurvefit (line 247)
Function value and YDATA sizes areincommensurate.
Error in sample1 (line 6)
a = lsqcurvefit('curvefun1', a0, x, tdata);
以下是对应的数据:
cumoil cumwater
66875.41 58977.89
67735.27 60461
68702.61 62111.58
69707.74 63778.53
70700.54 65502.97
71779.68 67433.32
72888.27 69551.3
73835.36 71377.45
74872.23 73369.16
75873.16 75029.27
76682.89 76438.22
77623.03 78030.04
78662.82 79861.07
79639.4 81524.4
80732.68 83373.33
81768.37 84971.66
82819.92 86584.91
83853.85 88167.91
84879.57 89706.48
85845.71 91149.57
86272.45 91733.81
86631.99 92420.38
87457.44 94050.57
88392.46 95877.68
89303.52 97558.14
90172.87 99446.22
91127.56 101512.4
92031.94 103342.9
92841.83 105022.1
请帮忙者注意: 公式中的p和q都是指数。 展开
2个回答
展开全部
1、对于非线性拟合函数(如指数函数等)用lsqcurvefit()函数的精度要比 nlinfit()函数要低。对于本例,用lsqcurvefit()函数nlinfit()函数0.95861,而nlinfit()函数nlinfit()函数0.99905。
2、自定义函数curvefun1(a,x)定义不够合理,还需要加一个绝对值符号,即f=abs((a(1).*x.^a(2))./(a(3)-x)).^(1/a(4)),这是指数方程的性质所决定。
3、自定义函数方程中有一个错误,'/'应为'./'。缺一个小点。
4、初值选定不合理,对于本例a0 =b=[-0.8 -0.2 -0.9 -0.3]
5、本例的拟合结果如下
a =[ -307506534.2, -1.122708895, -2085623.768, -0.6827697455]
即a(1)=b;a(2)=p;a(3)=R;a(4)=q
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询