最简单的使用牛顿法求函数的值


#!/usr/bin/env python
# 本文件演示下用牛顿法求方程的解


# 求解方程 fx = x * x - 9
def F(x):
return x * x - 9;


# 导数
def F_prime(x):
return 2 * x


# 得到下一个X
def Xn(x):
return x - F(x) / F_prime(x)


# 差值
def E(xn, x):
return abs(xn - x)


# 给x一个预设值
x = 10;

xn = Xn(x)
e = 0.000001

i = 0
while E(xn, x) > e:
i = i + 1
x = xn
xn = Xn(x)
print("Epoch {0}:x {1} xn {2}".format(i, x, xn))

x = xn
print("最优解 {0}".format(x))

### 使用 MATLAB 实现牛顿法求解函数极 #### 牛顿法简介 牛顿法是一种用于寻找函数零点的方法,在最优化领域中被广泛应用于找到目标函数的极小。该方法通过迭代更新当前估计,直到满足收敛条件为止。 #### 函数定义与初始化设置 为了展示如何利用牛顿法计算给定函数的极,先设定初始猜测点 `x0` 和精度阈 `eps` 以及最大迭代次数 `N`: ```matlab % 初始化参数 x0 = 2; eps = 1e-2; N = 100; ``` 此处选择了起始位置为 \( x_0 = 2 \),允许误差范围设为 \( ε = 1 × 10^{-2} \)[^3],并规定最多执行 100 步迭代操作以防止无限循环的发生。 #### 定义待优化的目标函数及其导数表达式 假设要处理的是符号形式表示的一元二次多项式,则可以这样创建对应的匿名函数句柄: ```matlab syms x % 声明变量作为符号对象 f_sym = @(x) (x - 1)^2 + exp(x); % 用户自定义的具体函数实例 df_dx = diff(f_sym(x), 'x'); % 计算一阶导数 df/dx ddf_ddx = diff(df_dx, 'x'); % 进一步获取二阶导数 d²f/dx² ``` 上述代码片段中的最后一行实现了对输入函数关于未知量 x 的两次连续微分运算,从而得到必要的梯度信息供后续步骤调用。 #### 编写核心算法逻辑 接下来编写实际执行寻优过程的核心部分——Newton_minValue() 函数体内部结构如下所示: ```matlab function [min_point, min_value] = Newton_minValue(func, init_guess, tol, max_iter) syms var_x; % 将传入的符号表达转换成可直接评估的形式 func_handle = matlabFunction(func); grad_func = matlabFunction(diff(func(var_x))); hess_func = matlabFunction(diff(grad_func(var_x))); curr_pos = double(init_guess); iter_count = 0; while true prev_pos = curr_pos; gradient_val = grad_func(curr_pos); hesse_matr = hess_func(curr_pos); if abs(gradient_val) < tol || iter_count >= max_iter break; end delta_update = -gradient_val / hesse_matr; curr_pos = curr_pos + delta_update; iter_count = iter_count + 1; end min_point = curr_pos; min_value = func_handle(min_point); end ``` 这段程序接收四个参数:目标函数、初猜、容差限度和最大迭代轮次;返回两个结果分别是最终逼近到的最佳点位坐标及对应处取得的最优解大小。注意这里采用了负号来确保每次调整方向总是指向下降最快的方向。 #### 调用示例 最后可以通过简单的命令行指令完成整个流程: ```matlab [min_pt, min_val] = Newton_minValue(f_sym, x0, eps, N); disp(['The minimum point is ', num2str(min_pt)]); disp(['The function value at this point is ', num2str(min_val)]); ``` 这会打印出由牛顿法所确定出来的局部最低点的位置连同其上的函数取情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值