如何解决拟合非线性方程的参数以匹配实验数据
我尝试使用 nls 函数修改我在此处找到的代码以实现这个更简单的等式,但到目前为止没有成功。
public class MovieDetailsFragment extends Fragment {
//ViewBinding
private MovieDetailsFragmentBinding movieDetailsFragmentBinding;
//viewmodel
private MovieDetailsviewmodel movieDetailsviewmodel;
//Movie
private MovieModel movie;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater,@Nullable ViewGroup container,@Nullable Bundle savedInstanceState) {
movieDetailsFragmentBinding = MovieDetailsFragmentBinding.inflate(inflater,container,false);
movieDetailsviewmodel = new viewmodelProvider(this).get(MovieDetailsviewmodel.class);
movieDetailsFragmentBinding.btnBack.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Navigation.findNavController(getActivity(),R.id.nav_host_fragment).navigateUp();
}
});
movie = getArguments().getParcelable("movie");
observerUrlVideoMovieChange();
//btn play video
movieDetailsFragmentBinding.btnPlay.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(movie.getVideo() == null) // if movie hasn't video
movieDetailsviewmodel.getUrlVideoMoviesID(movie.getId()); //get url
else
showVideo(movie.getVideo());
}
});
//show details
showDetails();
return movieDetailsFragmentBinding.getRoot();
}
//show trailer movie
private void showVideo(String videoId) {
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.youtube.com/watch?v=" + videoId));
startActivity(intent);
}
}
有人可以通过傻瓜分步指南来帮助解决这个问题吗?任何建议将不胜感激!
我的数据:t=θ 和 y=Y(θ)
new_f <- function(a,t,t1,dt,m){
1-exp(-a*((x-t1)/dt)^(m+1))
}
fit_d <- nls(y~new_f(a,-30,m),start=list(a=1,dt=46,m=1))
Error in nlsModel(formula,mf,start,wts) :
singular gradient matrix at initial parameter estimates
解决方法
有几个问题:
- new_f 中的 x 应该是 t
- 问题被过度参数化,因此无法识别参数。有无数个参数组合可以满足这个问题。特别是,a / dt^(m+1) 可以用单个参数代替。要解决这个问题,请从起始值中删除 dt 并将其修复为 46。
通过这些更改,代码会产生结果。
new_f <- function(a,t,t1,dt,m){
1-exp(-a*((t-t1)/dt)^(m+1))
}
dt <- 46
fit_d <- nls(y~new_f(a,-30,m),start = list(a = 1,m = 1))
fit_d
## Nonlinear regression model
## model: y ~ new_f(a,m)
## data: parent.frame()
## a m
## 0.560 3.315
## residual sum-of-squares: 0.3099
##
## Number of iterations to convergence: 13
## Achieved convergence tolerance: 4.165e-06
plot(y ~ t)
lines(fitted(fit_d) ~ t,col = "red")
,
从观察曲线的形状开始观察:
对于高 x 值,形状呈现指数型,因为 y 的对数标度非常线性:
对于 x 的低值,形状表现为线性:
如果我们尝试将曲线的两部分与 Heaviside 阶跃函数 H(x) 结合起来 结果不是很令人满意,因为连接处不平滑,如下图所示:
为了获得平滑的曲线,可以用逻辑函数代替 Heaviside 函数:
以上参数数值未优化。为了更好地拟合,必须进行非线性回归(这还没有完成)。非线性回归的一个主要困难是设置好的参数“猜测”值以启动迭代演算。这就是为什么上述近似值可能非常有用的原因。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。