【牛顿迭代法求极小值】

牛顿迭代法求极小值的编程实现
该文章已生成可运行项目,

牛顿迭代法求极小值

仅供参考

作业内容与要求

作业内容

作业要求

递交报告 + 代码

编程实现

计算偏导数

故上述非线性方程组的根可能为f(x,y)f(x, y)f(x,y)的极值点,至于是极小值点还是极大值点鞍点,就需要使用微积分中的黑塞矩阵来判断了。

牛顿迭代法求解非线性方程组

带入即可

python编程实现

# -*- coding: utf-8 -*- 
# 作者: @bushuo 
# 联系方式: **************@qq.com -->

"""
@File    :   main.py
@Time    :   2024/10/02 23:47:07
@Version :   
@Desc    :   数值分析第一次作业
"""

from math import sin, cos, exp

import numpy as np

# 定义匿名函数 fun(x, y)
f = lambda x,y: sin(x**2 + y**2) * exp(-0.1*(x**2 + y**2 + x*y + 2*x))
f1 = lambda x,y: x*cos(x**2 + y**2) - 0.1*(x + 0.5*y + 1)*sin(x**2 + y**2)
f2 = lambda x,y: y*cos(x**2 + y**2)-0.1*(y+0.5*x)*sin(x**2 + y**2)

f1_x = lambda x,y: -2*x**2*sin(x**2 + y**2) - 2*x*(0.1*x + 0.05*y + 0.1)*cos(x**2 + y**2) - 0.1*sin(x**2 + y**2) + cos(x**2 + y**2)
f1_y = lambda x,y: -2*x*y*sin(x**2 + y**2) - 2*y*(0.1*x + 0.05*y + 0.1)*cos(x**2 + y**2) - 0.05*sin(x**2 + y**2)
f2_x = lambda x,y: -2*x*y*sin(x**2 + y**2) - 2*x*(0.05*x + 0.1*y)*cos(x**2 + y**2) -<
本文章已经生成可运行项目
Matlab中的牛顿迭代(Newton-Raphson Method)是一种常用的数值优化技术,用于寻找多元函数的局部最小值。该方基于函数的梯度和Hessian矩阵(二阶导数),通过迭代更新当前点来逼近最小值。以下是使用Matlab的基本步骤: 1. **选择初始点**:首先需要一个初始估计的解向量,它可能是随机选取、用户指定或者其他算得到的。 2. **计算梯度**:对目标函数偏导数,得到每个变量的方向导数,也就是梯度向量。 3. **构建Hessian矩阵**:如果目标函数是可微分的,可以计算其所有二阶偏导数构成的Hessian矩阵。 4. **迭代公式**:应用牛顿迭代公式,即`x_new = x_old - H^-1 * g`,其中`x_new`是下一个猜测点,`x_old`是当前点,`g`是梯度向量,`H^-1`是Hessian矩阵的逆。 5. **检查收敛条件**:如果满足停止准则(如梯度或Hessian变化足够小,或者达到最大迭代次数),则认为找到局部最小值;否则继续迭代。 6. **迭代直到收敛**:不断重复上述步骤,直到达到预设的精度标准。 ```matlab function [x_min, f_min] = newtonMinimization(f, gradf, hessian, initialGuess, options) % f: 目标函数 % gradf: 梯度函数 % hessian: Hessian矩阵函数 % initialGuess: 初始猜测解 % options: 迭代选项(例如最大迭代次数,精度等) [x, f_val] = newton_descent(f, gradf, hessian, initialGuess, options); x_min = x; % 最终估计的最小值点 f_min = f_val; % 对应的函数值 end function [x, f_val] = newton_descent(f, gradf, hessian, x0, opt) % 实现牛顿迭代的核心部分 % ... (详细迭代代码) % 初始化 x = x0; options.iterations = opt.maxIterations; epsilon = opt.epsilon; while true % 更新步长 dx = -inv(hessian(x)) * gradf(x); % 新位置 x_new = x + dx; % 检查收敛 if norm(dx) < epsilon || abs(f(x_new) - f(x)) < epsilon break; end % 更新 x = x_new; end f_val = f(x); % 计算最终函数值 end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

bu_shuo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值