作业帮 > 综合 > 作业

mathematica非线性拟合

来源:学生作业帮 编辑:拍题作业网作业帮 分类:综合作业 时间:2024/04/28 05:30:50
mathematica非线性拟合
拟合的形式是Log((5.47-2*a+y)/(4*y-2*a))=1/150*b*x ,我有一批x相应y的数据,想求参数a、b.用mathematica应该怎么写啊?(包括x、y的录入方式也不知道.)
data = {{1, 1.81747}, {2, 1.8204}, {3, 1.82137}, {4, 1.82186}, {5, 1.82216}, {6, 1.82235}, {7, 1.82249}, {8, 1.8226}, {9, 1.82268}, {10, 1.82275}, {11, 1.8228}, {12, 1.82284}, {13, 1.82288}, {14, 1.82291}, {15, 1.82294}, {16, 1.82297}, {17, 1.82299}, {18, 1.82301}, {19, 1.82302}, {20, 1.82304}};
solu = Flatten[Solve[Log[10,(5.47 - 2 a + y)/(4 y - 2 a)] == 1/(150 b x), y]];
fitparameter = (FindFit[data, y /. solu, {a, b}, x])
fit = y /. solu /.fitparameter;
Show[ListPlot[data, PlotStyle -> Red], Plot[fit, {x, 1, 20}]]
将上述代码中的data输入成你需要的数据点即可,最后一行代码中的{x, 1, 20}用来调整画图的定义域范围
再问: 谢谢您的用心!我的数据是不知道为什么做不出来……假如取a=3(实验数据推理值),用excel做出来R方是=1的。
再答: 你做不出来的原因是:
1、Log后面的括号要使用方括号,这是mathematica的语法
2、你在Solve中调换了函数与自变量,但是在下面fitparameter和fit内的变量没有调换,弄清楚到底哪个是x,哪个是y,要与你输入的点对应

另外,需要明确你的拟合方程里Log使用的底数是10,还是e。
再问: 谢谢!取的是自然对数,但做出来的拟合明显与实验数据不符。。不知道mathematica是按什么标准来拟合的。
再答: data = Map[
Reverse, {{5.41, 14}, {5.32, 30}, {5.22, 50}, {5.2, 52}, {5.06,
82}, {4.93, 113}, {4.8, 148}, {4.62, 199}, {4.43, 262}, {4.31,
309}, {4.14, 388}, {3.99, 469}, {3.84, 567}, {3.73, 652}, {3.62,
758}, {3.53, 860}, {3.48, 941}, {3.42, 1035}, {3.37, 1122}}];
solu = Flatten[
Solve[Log[(5.47 - 2 a + y)/(2 y - 2 a)] == 1/150 b x, y]];
fitparameter = (FindFit[data, y /. solu, {a, b}, x])
fit = y /. solu /. fitparameter;
Show[ListPlot[data, PlotStyle -> Red], Plot[fit, {x, 0, 1000}]]

作图的时候,默认y是纵坐标,x是横坐标,因此,需要将数据点的x和y对调一下作图
再答: 虽然fit = x /. solu /. fitparameter;中你写的是x,但是在作图的时候,fit仍然是纵坐标

或者像如下这样交换x,y轴
data = {{5.41, 14}, {5.32, 30}, {5.22, 50}, {5.2, 52}, {5.06,
82}, {4.93, 113}, {4.8, 148}, {4.62, 199}, {4.43, 262}, {4.31,
309}, {4.14, 388}, {3.99, 469}, {3.84, 567}, {3.73, 652}, {3.62,
758}, {3.53, 860}, {3.48, 941}, {3.42, 1035}, {3.37, 1122}};
solu = Flatten[
Solve[Log[(5.47 - 2 a + x)/(2 x - 2 a)] == 1/150 b y, y]];
fitparameter = (FindFit[data, y /. solu, {{a, 3}, {b, 0.1723}}, x])
fit = y /. solu /. fitparameter;
Show[ListPlot[data, PlotStyle -> Red], Plot[fit, {x, 0, 7}]]
这里需要选择合适的a与b的初始值,要不然系统会报错
再问: 真大神!!!谢谢您!您知道mathematica里面的波函数软件包吗?
我看不懂啊。。

http://www.bb.ustc.edu.cn/jpkc/xiaoji/jswl/ch8.pdf
再答: 这个我没有研究过,貌似这不是一个默认安装的软件包~~~
再问: 谢谢您!Solve不是解方程吗?怎么可以用来拟合?y /. solu /. fitparameter又是什么意思呢?我看不懂这些函数的作用。。。
再答: Solve是解方程,原因是FindFit这个函数需要一个函数表达式作为拟合的格式,而你给出的是一个方程,Solve的作用就是把这个方程转化成函数表达式。y /. solu /. fitparameter是将函数表达是内的a和b替换成FindFit函数求出的a和b的值