不是所有方程都能求出精确解。
解方程
sinx(x) = cos(x),求x,在区间(0,1)范围内。
正常解法:
两边除以cosx得到tanx = 1
解的x = Π/4,使用计算机计算得到:0.78539816339744830961566084581988。
画图
画出sin(x)和cos(x)的函数图像,参见函数图像是如何画出来的(LiveCharts2)
放大图像,找到近似初始值,从图中可以看出交点在0.78和0.79之间。将初始值,设置为0.785。
FPI不动点迭代
g(x) = x + cos(x)-sin(x),之所以这样构造,是因为导数<1,会收敛。如果导数大于1的话,就会发散
Task.Run(() =>{double x = 0.785;for (int i = 0; i < 10; i++){ x = x + Math.Cos(x)-Math.Sin(x);}Debug.WriteLine("x:" + x );Debug.WriteLine("error:" + (Math.Cos(x)-Math.Sin(x)) );// 使用Dispatcher在UI线程中更新Greeting//Dispatcher.UIThread.InvokeAsync(() => Greeting = x.ToString()); // 更新Greeting并同步到UIRoot = x;});
运行结果:
x:0.7853981041998028
error:8.371811310858845E-08
和最初的0.785对应的error进行比较:0.0005630880618338052约等于5.63E-4。
取迭代次数是100的时候,这个时候和计算器的值很接近了。
x:0.7853981633974482
error:2.220446049250313E-16
从这里可以看出整整提升了4个数量级。其实最初的估计的额精度能满足大部分的场景了,当你想要更高的精度的时候,就的需要算法实现了。FPI只是其中一种,还有很多方法,比如二分法,牛顿方法等。
写在最后
工程中很多时候是无法求出精确解的或者精确解很难求出来。这个时候就需要数值计算来提高求解精度。理想气体状态方程PV=nRT,这个与实际方程式有差距的,不过我们可以根据PV=nRT来获取与真实值接近的初始V,然后带入实际的状态方程,不断迭代来获取到精度很高的的真实体积V。
公众号
更多内容,欢迎关注我的微信公众号:半夏之夜的无情剑客。