使用牛顿迭代法求高次方程的根
创作时间:
作者:
@小白创作中心
使用牛顿迭代法求高次方程的根
引用
CSDN
1.
https://blog.csdn.net/weixin_59908804/article/details/143134981
牛顿迭代法是一种用于求解方程近似根的数值方法,其基本思想是通过不断求曲线上的某点的切线,将切线的零点近似为方程的解,如此循环迭代。本文将详细介绍牛顿迭代法的原理,并通过一个金融领域的实际案例(计算内部收益率IRR)来展示其具体应用。
牛顿迭代法
牛顿迭代法通过不断求曲线上的某点的切线,将切线的零点近似为方程的解,如此循环迭代。牛顿迭代法以平方速度逼近函数的零点,是比二分法更快的迭代方法。
数学解释
对于方程f(x) = 0,取定一个r0,求f(x)在r0处的切线l。然后求l的零点r1,然后以此迭代,依次求r2, r3, ...
实例展示
在金融中,我们有时会用内部收益率IRR来评价项目的投资财务效益,它等于使得投资净现值NPV等于0的贴现率。换句话说,给定项目的期数T、初始现金流CF0和项目各期的现金流CF1, CF2, …,CFT,IRR是下面方程的解:
为了简单起见,本题假定:除了项目启动时有一笔投入(即初始现金流CF0 < 0)之外,其余各期均能赚钱(即对于所有i=1,2,…,T,CFi > 0)。根据定义,IRR可以是负数,但始终大于-1。
题目分析
本题本质上是求方程NPV(IRR+1) = 0的解。注意到,实际上IRR+1总是作为一个整体,所以我们记x = IRR+1。故而求NPV(x)(x>0)的零点即可。
不难发现,NPV'(x)始终小于0,所以NPV(x)最多只有一个零点。
求ri处的切线:
y - NPV(x) = NPV'(x)(x - ri)
迭代:ri+1 = -NPV(ri) / NPV'(ri) + ri
此外,对于r0的给出,根据经验给出1.5(具体是怎么知道的我也不清楚)。由此反复迭代,直到NPV(x)符合条件,此时以rn近似x0。
代码实现
求NPV(x):
double functionF(double x,double*CF,int len) {
double sum = 0.0;
for (int i = 0; i < len; i++)
sum += CF[i] * pow(x, -i);
return sum;
}
求NPV'(x):
double derivitiveF(double x, double* CF, int len) {
double sum = 0.0;
for (int i = 1; i < len; i++)
sum += -CF[i] * pow(x, -i - 1);
return sum;
}
迭代:
NPV = functionF(x, CF, T + 1);
if (NPV < 1e-5)break;//退出条件
x = x - NPV / derivitiveF(x, CF, T + 1);
完整代码:
#define MAX_COUNT 20
double functionF(double x,double*CF,int len) {
double sum = 0.0;
for (int i = 0; i < len; i++)
sum += CF[i] * pow(x, -i);
return sum;
}
double derivitiveF(double x, double* CF, int len) {
double sum = 0.0;
for (int i = 1; i < len; i++)
sum += -CF[i] * pow(x, -i - 1);
return sum;
}
int main(){
float result[MAX_COUNT];
int index = 0;
while(1){//反复接受数据 知道接收到T=0退出循环
unsigned int T = 0;
double CF[MAX_COUNT];//storage the CFn
double NPV = 0.0;
double x = 1.5;//initial value
scanf_s("%d", &T);
if (0 == T)break;
printf("You should print at least %d datas.\n", T + 1);
for (int i = 0; i < T + 1; i++)scanf_s("%lf", &CF[i]);
while (1) {
NPV = functionF(x, CF, T + 1);
if (NPV < 1e-5)break;
x = x - NPV / derivitiveF(x, CF, T + 1);//interate
}
double IRF = x - 1;
result[index++] = (float)IRF;//storage
}
for(int i=0;i<index;i++)//print the results
printf("%0.2f\n",result[i]);
return 0;
}
热门推荐
山东黄河三角洲:从盐碱地到生态乐园的绿色蝶变
【精选】15首经典爱情诗词,诉说千年情话
厦门三日游打卡最美自然景观
商业地产租赁权转让:这些坑,你踩过吗?
租房合同转让协议怎么写才有效?
房屋转租的法律风险与防范指南
迎接蛇年!最火红色头像大盘点
黑巧克力的7大健康好处:从降低血压到预防糖尿病
双流黄龙溪古镇:千年水乡的美食与文化
双流老妈兔头:30年匠心传承,成都美食文化的一颗明珠
双流名菜如何拉动地方经济?
冬季护肤:这些小妙招让你告别瘙痒
福安美食大揭秘:吃货必打卡!
老街炒鸡:周口必打卡网红美食
鼓浪屿:厦门必打卡的浪漫小岛
武夷山自驾游:最美风景在路上
福建五大世界遗产地深度游攻略:从武夷山到泉州古城
你了解祭孔大典的流程吗?
国槐的多重价值:从生态到文化的全面解读
细说国槐花语和寓意
打卡徐州宝莲寺:千年古刹的盛唐风范
徐州宝莲寺举办重阳节登高祈福活动,百名老人共聚蟠桃山
腊八节打卡徐州宝莲寺:品味千年文化,感受佛教魅力
蟠桃庙会即将开幕,探秘徐州宝莲寺千年文化
古代工具制造者和大象足迹:科学家解开旧石器时代采石场遗址之谜
揭秘旧石器时代采石场:直立人与大象迁徙的千年之约
鸿门宴里的餐桌礼仪大揭秘
你的餐桌礼仪暴露了什么?
鲁迅眼中的恩师:藤野严九郎的医学传奇
芦笋种植需要哪些条件