牛顿法求方程的根(C&Matlab&Python语言实现)

目录

1、概述

2、案例

3、程序源代码

(1)C语言实现 

(2)Matlab实现

(3)Python实现

 (4)Python中Sympy库

4、总结   

5、参考文献 


1、概述

      详细知识点我在前面的牛顿迭代法开方已经总结啦,这里就稍做补充。下面我们就直接给出案例,然后分享代码和结果。 

2、案例

3、程序源代码

(1)C语言实现 

#include<stdio.h> 
#include<math.h> 
int main() 
{
double pow(double x,double y);
double x0,x,f1,f2; 
x0=1; 
do
{ 
	x=x0; //初值 
	f1=pow(x,7)-28*pow(x,4)+14; 
	f2=7*pow(x,6)-112*pow(x,3); //对函数 f1 求导 
	x0=x-f1/f2; //迭代公式 
} 
while(fabs(x0-x)>1e-5); 
printf("%9.8f\n",x0); 
return 0; 
}

[注]C语言中math.h的全面总结

                        

(2)Matlab实现

%Newton 迭代法 
x=1; 
while abs(x.^(7)-28*x.^(4)+14)>0.00001 
      x=x-(x.^(7)-28*x.^(4)+14)/(7*x.^(6)-112*x.^(3)); 
end 
vpa(x,8)

[注]Matlab中vpa()函数的应用。(本例中精度为保留8位有效数字)

                                  

(3)Python实现

import numpy as np
from sympy import *
import matplotlib.pyplot as plt
plt.style.use('ggplot')     #设置绘图风格
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']   #处理中文乱码
plt.rcParams['axes.unicode_minus']=False                #坐标轴负号的处理

x = symbols('x')
x1= 0  #区间下限
x2= 0.11  #区间上限
x0 = (x1+x2)/2  #迭代初始值
x_list = [x0]
i = 0

def f(x):
    f = x**7-28*x**4+14
    return f

x_values = []
y_values = []
while True:
    if diff(f(x),x).subs(x,x0) == 0:    #导数为零
        print('极值点:',x0)
        break
    else:
        x0 = x0 - f(x0)/diff(f(x),x).subs(x,x0)  #diff()求导,subs()指定位置求导
        x_list.append(x0)
    '''if len(x_list) > 1:
        i += 1
        error = abs((x_list[-1] - x_list[-2]) / x_list[-1])
        if error < 10 ** (-6):
            print(f'迭代第{i}次后,误差小于10^-5')
            break
    else:
        pass'''
    #误差为零时:
    if len(x_list) > 1:
        i += 1
        error = abs((x_list[-1] - x_list[-2]) / x_list[-1])
        x_values.append(i)
        y_values.append(error)
        if error == 0:
            print(f'迭代第{i}次后,误差等于0')
            break
    else:
        pass

print(f'所求方程式的根为{x_list[-1]}')

#横坐标是迭代次数,纵坐标是误差值
plt.plot(x_values,
         y_values,
         color = 'steelblue', # 折线颜色
         marker = '*', # 折线图中添加圆点
         markersize = 3, # 点的大小
         )
# 修改x轴和y轴标签
plt.xlabel('迭代次数')
plt.ylabel('误差值')
# 显示图形
plt.show()
迭代第44次后,误差等于0
所求方程式的根为3.03057732650459

 

 (4)Python中Sympy库

      在(3)中有一个Python中很重要的一个库:sympy。遇到复杂计算找python绝对不让你失望,sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题。虽然Matlab的类似科学计算能力也很强大,但是Python以其语法简单、易上手、异常丰富的三方库生态,个人认为可以更优雅地解决日常遇到的各种计算问题。

   SymPy是一个符号计算的Python库。它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。它完全由Python写成,不依赖于外部库。   

      SymPy支持符号计算、求导,求偏导,高精度计算、模式匹配、绘图、解方程、微积分、组合数学、离散数学、几何学、概率与统计、物理学等方面的功能。
 

4、总结   

    计算结果是正确的。

5、参考文献 

     https://blog.csdn.net/Dontla/article/details/106201901

      https://blog.csdn.net/cj151525/article/details/95756847

牛顿迭代法(Newton’s Method)迭代求根的Python程序_Fo*(Bi)的博客-CSDN博客_newton迭代法python

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Matlab中,可以使用fsolve函数来使用牛顿迭代法方程组。fsolve函数的使用方法如下: 1. 定义方程组:使用符号变量syms定义方程组的变量,然后定义方程组的表达式。 2. 定义初始值:设置初始值,作为迭代的起点。 3. 调用fsolve函数:使用fsolve函数方程组。将方程组的表达式和初始值作为参数传入fsolve函数。 下面是一个使用fsolve函数方程组的示例代码: ```matlab syms x1 x2; f1 = x1^2 + x2^2 - 4; f2 = x1^2 - x2^2 - 1; F = \[f1; f2\]; x0 = \[1.6; 1.2\]; \[x, fval\] = fsolve(@(x) double(subs(F, \[x1, x2\], x)), x0); ``` 在这个示例中,我们定义了一个包含两个方程方程组F,然后设置了初始值x0。最后,使用fsolve函数方程组,并将结果保存在变量x中。 请注意,为了在fsolve函数中使用符号变量,我们使用了double和subs函数来将符号变量转换为数值,并将其传递给fsolve函数。 希望这个示例能够帮助你理解如何在Matlab中使用fsolve函数来使用牛顿迭代法方程组。 #### 引用[.reference_title] - *1* *2* *3* [数值分析:利用牛顿法解非线性方程组的matlabpython实现](https://blog.csdn.net/meng_xin_true/article/details/106346554)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值