牛顿迭代法解指数方程(aX + e^x解 = b )
![]()
高中好友突然问我一道这样的问题,似乎是因为他们专业要做一个计算器,其中的一道习题是要求计算器实现这样的功能。
整理一下要求:解aX + e^X = b 方程。解方程精度要求0.01,给定方程只有一解,a>0,b>0,0<X<20。
当被第一次问及这样一个问题的时候,我脑海里反映的第一个方法就是「牛顿迭代法(NewtonMethod」。然而自己算法功底太差了,从来没有真正去了解过牛顿迭代法,反正早晚都是要学的,正好便借着这个机会学习了一个。
我一直认为牛顿迭代法的效率应该是几个近似求解方程的最快方法,于是查了一下百度百科后进行了实现。
实现代码如下:
#include<stdio.h>
#include<math.h>
#define MAX 20
#define MIN 0
#define MID 10
#define eps 1e-2
#define fx a*x+exp(x)-b
#define fdx a + exp(x)
double a,b,x;
double binary() ; // 二分查找
double NewtonMethod() ; // 牛顿迭代法
int main()
{
scanf("%lf%lf",&a,&b);
printf("%.2lf\n",binary()) ;
printf("%.2lf\n",NewtonMethod()) ;
return ;
} double binary() // 二分查找
{
x = MID ;
double x1 =MIN , x2 = MAX ;
while( fabs(fx) > eps)
{
if( fx < )
x1 = x ;
if( fx > )
x2 = x ;
x = ( x1 + x2) / ;
}
return x ;
} double NewtonMethod() // 牛顿迭代
{
x = ;
while()
{
if( fabs(fx) > eps )
{
x = x - (fx) / (fdx);
}
else return x ;
}
}
网上普遍都是牛顿迭代法求解一元二次方程或者平方根,我于是照猫画虎根据牛顿迭代法的核心x1=x0 - f(x) / f'(x) 照猫画虎学习了一个。关于证明还不是太会,自己手画了一下发现这样的方法近似非常快,我记得曾今刚看到过资料说两次迭代好像eps就可以小于多少……
自己代码功底还是太差了,二分也写跪多次,写出了什么if (fx < 0 ) x = ( x + MAX ) / 2这样现在看来有点羞耻想笑的代码。最后遇到最大的一个问题是在牛顿迭代法 fx / fdx 因为fx和fdx是用宏定义的,直接展开后导致运算优先级出现了问题然后各种程序跑崩……所以这里宏定义以后要考虑加括号,要认真考虑优先级问题,不然出了问题感觉挺难发现的。
以前前辈们总说代码要多写多练多手敲,就算把书上代码照抄到电脑上都是很好的。一直不能理解,觉得这样做没什么意义。现在深刻感觉到,代码看再多遍不如自己手写一遍,算法理论知道再清楚,不多手写几次就不知道坑在哪里,就实现不出来。以后一定多写代码。
不过最后有一个问题我一直不能理解:
为了比较其与二分的效率,我写了一个随机器准备对拍一下:
#include<iostream>
#include<ctime>
#include<cstdlib>
using namespace std ;
int main()
{
srand((int) time() ) ;
freopen("a.out","w"
,stdout) ;
for( int x = ; x <= ; x++)
cout << rand() % + <<' ' << rand() % + <<endl ;
return ;
}
产生了一万组 1 - 20 的数据文件,然后重定向到文件分别跑了一下数据,利用<ctime>下的 (double ) clock() / CLOCK_PER_SEC 来计算时间。
测试结果如下:
![]()
一万组数据 牛顿迭代反而慢于二分,不知道是因为我的数据产生中没有考虑过有方程有没有解的情况,还是程序写的不好或者输入输出有问题……?
不太会分析两个这样的算法的时间复杂度,真诚询问。二分法我感觉应该是O(nlgn) ?不会证明牛顿迭代法……就更难分析牛顿迭代法了……理论上我感觉牛顿迭代法的性能应该优于二分法啊。不知道问题出在哪里了……
牛顿迭代法解指数方程(aX + e^x解 = b )的更多相关文章
- 【Java例题】4.4使用牛顿迭代法求方程的解
4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...
- C语言实现牛顿迭代法解方程
利用迭代算法解决问题,需要做好以下三个方面的工作: 一.确定迭代变量 在可以用迭代算法解决的问题中,我们可以确定至少存在一个可直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量. 二.建立迭 ...
- 华为OJ1964-求解立方根(牛顿迭代法)
一.题目描述 描述: 计算一个数字的立方根,不使用库函数. 函数原型double getCubeRoot(double input) 输入: 待求解参数 double类型 输出: 输出参数的立方根,保 ...
- 牛顿迭代法解非线性方程组(MATLAB版)
牛顿迭代法,又名切线法,这里不详细介绍,简单说明每一次牛顿迭代的运算:首先将各个方程式在一个根的估计值处线性化(泰勒展开式忽略高阶余项),然后求解线性化后的方程组,最后再更新根的估计值.下面以求解最简 ...
- 解同余式ax ≡ c(mod m)
将式子变形为 ax-c=my 可以看出原式有解当且仅当线性方程ax-my=c有解 设g = gcd(a, m) 则所有形如ax-my的数都是g的倍数 因此如果g不整除c则原方程无解. 下面假设g整除c ...
- 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现(最有效版)
数值分析里面经常会涉及到用MATLAB程序实现用列主元消去法分别解方程组Ax=b 具体的方法和代码以如下方程(3x3矩阵)为例进行说明: 用列主元消去法分别解方程组Ax=b,用MATLAB程序实现: ...
- 线性代数:Ax=b的解
n列的矩阵A,当且仅当向量b是列空间C(A)的一个向量时,Ax=b有解. C(A)的零空间是N(A),N(A)正交补是A的行空间C(T(A)), 依据上一章的结论,任何Rn向量可以表示为r+n,其中n ...
- 【线性代数】2-1:解方程组(Ax=b)
title: [线性代数]2-1:解方程组(Ax=b) toc: true categories: Mathematic Linear Algebra date: 2017-08-31 15:08:3 ...
- 【清橙A1094】【牛顿迭代法】牛顿迭代法求方程的根
问题描述 给定三次函数f(x)=ax3+bx2+cx+d的4个系数a,b,c,d,以及一个数z,请用牛顿迭代法求出函数f(x)=0在z附近的根,并给出迭代所需要次数. 牛顿迭代法的原理如下(参考下图) ...
随机推荐
- MPMoviePlayerController
属性 说明 @property (nonatomic, copy) NSURL *contentURL 播放媒体URL,这个URL可以是本地路径,也可以是网络路径 @property (nonatom ...
- php笔记(五)PHP类和对象之对象的高级特性
对象比较,当同一个类的两个实例的所有属性都相等时,可以使用比较运算符==进行判断,当需要判断两个变量是否为同一个对象的引用时,可以使用全等运算符===进行判断. class Car { } $a = ...
- 3、XCode: 如何添加自定义代码片段
我们经常会定义一些retain的property,而且大概每次我们都会像这样写: @property (nonatomic, retain) Type *name; 每次都要老老实实的把“@prope ...
- PhotoSwipe简介
官方网站http://www.photoswipe.com/源码示例http://github.com/downloads/codecomputerlove/PhotoSwipe/code.photo ...
- B/S和C/S【转载Jane的博客 http://blog.sina.com.cn/liaojane】
什么是C/S和B/S结构? C/S又称Client/Server或客户/服务器模式.服务器通常采用高性能的PC.工作站或小型机,并采用大型数据库系统,如Oracle.Sybase.In ...
- 如何让文字和input框水平放在div里
#text_input { height: 16px; width: 133px; margin-right: 5px; padding:0 0 0 3px; border: 1px solid #C ...
- spark-2.0.0与hive-1.2.1整合
SparkSQL与Hive的整合 1. 拷贝$HIVE_HOME/conf/hive-site.xml和hive-log4j.properties到 $SPARK_HOME/conf/ 2. 在$SP ...
- 基于HTML5 的WebSql本地设备数据库
HTML5 的 Web SQL Database 用本地和会话存储实现简单的对象持久化,对繁琐的关系数据进行处理. 在 W3C 的 Web SQL Database 规范中(参照 介绍)有这样的描述: ...
- Linux下安装vnstat流量统计
1. 下载安装 cd /data/software wget http://humdi.net/vnstat/vnstat-1.11.tar.gz tar zxf vnstat-1.11.tar.gz ...
- js--学习方法之2-转
再说几点忠告 1,不要着急看一些复杂网页效果的代码,这样除了打击你自信心,什么也学不到.没达到一定的武功水平,割了小JJ也学不会葵花宝典的. 2,别急着加技术交流QQ群,加牛人QQ.如果你找张三丰交流 ...