微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

拟合非线性方程的参数以匹配实验数据

如何解决拟合非线性方程的参数以匹配实验数据

我尝试使用 nls 函数修改我在此处找到的代码以实现这个更简单的等式,但到目前为止没有成功。

Equation

 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")

screenshot

,

从观察曲线的形状开始观察:

对于高 x 值,形状呈现指数型,因为 y 的对数标度非常线性:

enter image description here

对于 x 的低值,形状表现为线性:

enter image description here

如果我们尝试将曲线的两部分与 Heaviside 阶跃函数 H(x) 结合起来 结果不是很令人满意,因为连接处不平滑,如下图所示:

enter image description here

为了获得平滑的曲线,可以用逻辑函数代替 Heaviside 函数:

enter image description here

以上参数数值未优化。为了更好地拟合,必须进行非线性回归(这还没有完成)。非线性回归的一个主要困难是设置好的参数“猜测”值以启动迭代演算。这就是为什么上述近似值可能非常有用的原因。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。