| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5481 人关注过本帖
标题:牛顿迭代法解高次方程和超越方程,新手求教
只看楼主 加入收藏
Weldon
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-2-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:10 
牛顿迭代法解高次方程和超越方程,新手求教
图片附件: 游客没有浏览图片的权限,请 登录注册

用迭代法求
x*sin(x)=1的解

及其

x^41+x^3+1=0   在 -1 附近的根

我用了 xn+1 = xn - f(xn)/f'(xn)的公式

这段是x*sin(x)=1的代码
程序代码:
# include <stdio.h>
# include <math.h>
# define eps 1e-6

int main(void)
{
    float x0, x1;

    x0 = 1.0;
    x1 = (1 + x0*x0*cos(x0)) / (sin(x0) + x0*cos(x0));

    do
    {
        x0 = x1;
        x1 = (1 + x0*x0*cos(x0)) / (sin(x0) + x0*cos(x0));
    }while(fabs(x0 - x1) > eps);

    printf("%f", x1);

    return 0;
}


结果是 1.114157  带回方程不成立
而且当初值是2的时候 结果是 -9.317243, 带回方程也不成立
每次初值改变结果都改变了?


这段是x^41+x^3+1=0的代码
程序代码:
# include <stdio.h>
# include <math.h>
# define eps 1e-6



int main(void)
{
    float x0, x1;

    x0 = 1.0;
    x1= x0 - ((pow(x0, 41) + pow(x0, 3) + 1) / (pow(x0, 40) + 3*pow(x0, 2)));

    do
    {
        x0 = x1;
        x1= x0 - ((pow(x0, 41) + pow(x0, 3) + 1) / (pow(x0, 40) + 3*pow(x0, 2)));
        
    }while (fabs(x1 - (-1)) > eps);

    printf("%f\n", x1);


    return 0;
}



结果是   -1.#IND00    据说是 0 作为除数了??


请教大家了!!!!万分感谢!!!


[此贴子已经被作者于2017-11-5 20:03编辑过]

搜索更多相关主题的帖子: 方程 include cos 结果 pow 
2017-11-05 20:01
像风像水
Rank: 2
等 级:论坛游民
帖 子:5
专家分:62
注 册:2017-11-4
收藏
得分:5 
程序代码:
>> 1.114157 * sin( 1.114157) 
ans =
    1.0000

>> -9.317243 * sin(-9.317243)
ans =1.0000



代到原方程怎么就不成立?

===每次初值改变结果都改变了?
那是因为牛顿迭代法是局部的,并且x*sin(x)=1的解有无数个。
2017-11-05 22:09
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


[此贴子已经被作者于2017-11-6 00:44编辑过]

2017-11-06 00:42
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
include <stdio.h>
# include <math.h>
# define eps 1e-6

int main(void)
{
    float x0, x1;

    x0 = 1.0;
    x1= x0 - ((pow(x0, 41) + pow(x0, 3) + 1) / (41*pow(x0, 40) + 3*pow(x0, 2)));

    do
    {
        x0 = x1;
        x1= x0 - ((pow(x0, 41) + pow(x0, 3) + 1) / (41*pow(x0, 40) + 3*pow(x0, 2)));
        
    }while (fabs(x1 - x0) > eps);

    printf("%f\n", x1);


    return 0;
}
迭代初始值最好是-1,因为是求-1附近的解。避免多解。

[此贴子已经被作者于2017-11-6 01:25编辑过]

2017-11-06 01:07
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
图片附件: 游客没有浏览图片的权限,请 登录注册
2017-11-06 02:43
Weldon
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-2-6
收藏
得分:0 
回复 2楼 像风像水
谢谢!我按计算器的,可能用错了吧。。万分感谢!!!
2017-11-07 18:50
Weldon
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-2-6
收藏
得分:0 
回复 5楼 zbjzbj
谢谢!请问这是什么软件啊~
2017-11-07 18:54
Weldon
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-2-6
收藏
得分:0 
回复 4楼 zbjzbj
谢谢!
您写的终止条件是while (fabs(x1 - x0) > eps);
我写的终止条件是while (fabs(x1 - (-1)) > eps);
所以出错了 ;

请问这里怎么理解啊,我想的是和-1 比较接近的时候。。。
而实际上是两次结果差值很小的时候;
为什么是此时跳出呢??

万分感谢!!!
2017-11-07 19:03
zbjzbj
Rank: 12Rank: 12Rank: 12
来 自:郑州
等 级:贵宾
威 望:52
帖 子:633
专家分:3045
注 册:2011-4-22
收藏
得分:15 
回复 8楼 Weldon
题目的要求是在多根的情况下,找出-1附近的根,并不能保证迭代收敛于-1,你用-1比较已经背离了牛顿迭代法。已经出根了,你看根和-1的差别在eps之内吗?

[此贴子已经被作者于2017-11-7 21:38编辑过]

2017-11-07 21:35
Weldon
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2016-2-6
收藏
得分:0 
回复 9楼 zbjzbj
好的!
谢谢!
2017-11-08 17:49
快速回复:牛顿迭代法解高次方程和超越方程,新手求教
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014170 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved