账号 自动登录 找回密码 密码 欢迎注册
 搜索

# [讨论] 二元牛顿迭代法，下面哪个是正确的？还是都正确？

### 马上注册，结交更多好友，享用更多功能，让你轻松玩转社区。

×

https://zhuanlan.zhihu.com/p/580580125

https://www.docin.com/p-1445113743.html

https://blog.csdn.net/red_stone1/article/details/70260070

楼主| 发表于 2024-7-25 09:22:44 | 显示全部楼层
 我看了感觉两种办法都是正确的，但是第一种迭代，似乎更漂亮一些， 第二种迭代比较丑， 但是感觉他们的推理没问题！ 那究竟是哪个好呢？

楼主| 发表于 2024-7-25 09:47:19 | 显示全部楼层
 13.5 Solving Two General Equations in Two Variables One nice feature of Newton's Method (and of Poor Man's Newton as well) is that it can easily be generalized to two or even three dimensions. That is, suppose we have two standard functions, f and g of two variables, x and y. Each of the equations, f(x, y) = 0, and g(x, y) = 0 will typically be satisfied on curves, just as similar linear equations are satisfied on straight lines. And suppose we seek simultaneous solutions to both equations, which will then be at the intersections, if any, of these curves. If we could solve either of the equations for x say, in terms of y, we could find a parametric representations of the curve solutions to it (with y as parameter), and use the divide and conquer method of the last section on the other function, cutting the parameter interval in half at each step as in one dimension. This is a slow and steady method that can be implemented fairly easily. But it assumes we can obtain a parametric representation of one or the other curve. We can always try Newton's method, which is fairly easy to implement in general. https://ocw.mit.edu/ans7870/18/1 ... er13/section05.html 这儿也是方法2

 表达形式不同而已，矩阵求逆表达式代入应该可以写成同样形式

### 点评

楼主| 发表于 2024-7-25 10:02:46 | 显示全部楼层
 mathe 发表于 2024-7-25 09:54 表达形式不同而已，矩阵求逆表达式代入应该可以写成同样形式 我感觉不是一种表达式呀，你仔细代入了吗？我现在被这个问题困惑了

楼主| 发表于 2024-7-25 10:58:37 | 显示全部楼层
 mathe 发表于 2024-7-25 09:54 表达形式不同而已，矩阵求逆表达式代入应该可以写成同样形式 你是对的！这两个表达式是完全一样的！ 我把第一个逆矩阵理解成了，先求行列式，然后再求倒数！。 然后我自己码代码，怎么搞都不收敛！丢人丢大了！ 应该理解成先求矩阵，然后对矩阵求逆，然后再矩阵乘法 (fx,fy;gx,gy)的逆矩阵是(gy,-fy;-gx,fx)/(fx*gy-gx*fy)我的记忆办法是主颠倒，副变号（主对角线调换一下，副对角线变号，再除以行列式的值）

楼主| 发表于 2024-7-25 11:06:31 | 显示全部楼层
 mathe 发表于 2024-7-25 09:54 表达形式不同而已，矩阵求逆表达式代入应该可以写成同样形式Clear["Global*"]; f=x^2-10*x+y^2+8 g=x*y^2+x-10*y+8 jacob=D[{f,g},{{x,y}}]//Simplify (*雅可比矩阵*) next={x,y}-Inverse[jacob].{f,g} (*雅克比矩阵的逆矩阵*) {x0,y0}={3.0,3.0}(*初始值*) FindRoot[{f,g},{{x,x0},{y,y0}}](*软件自身的求解程序求解结果*) Do[ {x0,y0}=N[(next/.{x->x0,y->y0}),20];     Print[N[{x0,y0},20]] ,{k,1,15}] 复制代码 上我自己写的代码。 next={x,y}-Inverse[jacob].{f,g} 复制代码 这行我原本写成了 next={x,y}-{f,g}/Det[jacob]复制代码 结果迭代了几千次，都不收敛，一般牛顿迭代法搞个十次左右就能收敛了。 这明显收敛，那肯定是错误的！ 即使我再傻，我也相信代码肯定有问题！

 本帖最后由 Jack315 于 2024-7-25 13:13 编辑 修改了一下代码： Clear["Global*"]; precision = 20; p = precision + 1; f = x^2 - 10*x + y^2 + 8; g = x*y^2 + x - 10*y + 8; {x0, y0} = SetPrecision[{3.0, 3.0}, precision];(*初始值*) FindRoot[{f, g}, {{x, x0}, {y, y0}}, WorkingPrecision -> precision](*软件自身的求解程序求解结果*) jacob = D[{f, g}, {{x, y}}] // Simplify;(*雅可比矩阵*) jacob // MatrixForm next = {x, y} - Inverse[jacob].{f, g}; (*雅克比矩阵的逆矩阵*) {err, err0, iter, maxiter} = {1, 10^-precision, 0, 10}; While[err > err0, iter++; {x1, y1} = SetPrecision[(next /. {x -> x0, y -> y0}), 20]; xerr = SetPrecision[Abs[x1 - x0], p]; yerr = SetPrecision[Abs[y1 - y0], p]; err = Max[xerr, yerr]; Print[{iter, err, x1, y1}]; If[iter > maxiter - 1,   Print["超出最大允许的迭代次数，迭代异常终止！"];   Break[]]; {x0, y0} = {x1, y1} ]复制代码迭代 6 次结束： x=2.1934394154153081387 y=3.0204664681230335884 7# 的代码也得出正确结果，迭代不应该很多次后还不收敛的。

 用下列命令作图可以看到一共有 2 个解： Plot3D[{0, f, g}, {x, 0, 4}, {y, 0, 4}]复制代码将起始点设为 (-1,-1)，迭代 7 次得到结果：x=1, y=1。 将起始点设为 (-3,-3)，迭代 11 次得到结果：x=1, y=1， 但 FindRoot 报告迭代 100 次后仍未收敛。

### 点评

楼主| 发表于 2024-7-25 15:34:23 | 显示全部楼层
 Jack315 发表于 2024-7-25 13:28 用下列命令作图可以看到一共有 2 个解： 将起始点设为 (-1,-1)，迭代 7 次得到结果：x=1, y=1。 你的意思是说mathematica的findroot函数bug

 您需要登录后才可以回帖 登录 | 欢迎注册 本版积分规则 回帖并转播 回帖后跳转到最后一页

GMT+8, 2024-8-8 16:10 , Processed in 0.034891 second(s), 20 queries .