algorithm - MATLAB中的牛顿求根方法:二次与三次收敛
问题描述
所以我有这个例子牛顿的求根方法,下面有二次收敛。它采用函数 f、f df 的导数、初始猜测 g 和公差 tol。它输出到达第 n 个根的 # 次迭代、根估计 r 和误差逼近 err。
function [it, r, err] = QuadraticN(f, df, g , tol)
num_it = 20;
it_max = num_it + 1;
x(1)=(g + num_it)/2; %set x at n = 1
n = 1;
r = 0; % root
it = 0; % iteration #
err =0; % error
% n = 1
r(1) = x(1)-f(x(1))/df(x(1)); % root at n = 1
err(1) = abs(x(1)-g); % error at n = 1
% n > 1
while (min(abs(f(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
x(n+1)=x(n)-f(x(n))/df(x(n)); % quadratic method
it_max=x(n); % reset counter
r= x(n); % set root to current at n
err = f(x(n)); % set error to current
it = n; % keep track of iterations
n=n+1; % increment to next n
end
end
鉴于此示例,我正在尝试实现使用三次收敛而不是二次收敛的方法的第二个版本,这就是我所拥有的(这只是将更改为三次的函数的一部分,它采用相同的输入加上 ddf = 二阶导数):
r(1) = x(1)-df(x(1))/ddf(x(1)) + (sqrt((df(x(1)))^2 -
2*f(x(1))*ddf(x(1)))) / ddf(x(1));
err(1) = abs(x(1)-g); % error at n = 1
while (min(abs(ddf(x(n))))) && (abs(x(n)-it_max)>tol) && (it < num_it)
cube = ((sqrt((df(x(n)))^2 - 2*f(x(n))*ddf(x(n)))) / ddf(x(n)));
first = x(n) - df(x(n))/ddf(x(n));
first = real(first); % is this right?
x(n+1) = first + (cube);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% FIX THIS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% check when to do plus or minus
if( first > 0)
x(n+1)=x(n)-df(x(n))/ddf(x(n)) + cube;
else
x(n+1)=x(n)-df(x(n))/ddf(x(n)) - cube;
% end
我不确定我是否在检查何时正确使用 +/- 立方体。我知道这将取决于多重性,但我不确定是否首先使用(牛顿的基本方法)。它正确输出了一些根,但例如对于方程 -x^3 + 8 和初始猜测 2,我得到 -9.85985274E-01。现在我不知道这是否是上述问题的一部分,或者是否在计算之前转换为实数。我也收到负面错误。我检查的方式与检查二次方的方式相同,但我不确定这是否正确。
解决方案
推荐阅读
- node.js - 如何使用 NodeJS 13 和 Typescript 3.8 导入 esm 模块?
- dart - 如何删除字符串中的前导0
- css - 如何在 tornado fx 中制作带圆角的文本字段?(科特林)
- c# - 如何在 UserManager CreateAsync 中查看控制器中出现的错误?
- reactjs - React props 状态同步导致不必要的第一次重新渲染
- python - 我可以在 PyQt5 应用程序中嵌入处理窗口吗?
- reactjs - 无法从 react-admin 的编辑组件中删除删除按钮
- image - 在使用 cnn 的普通图像分类中?密集层中单位的值应该是多少?
- node.js - 如何保护简单的 Node.js RESTful API
- php - 如何从 WooCommerce 客户列表中删除 WooCommerce 来宾客户