急!!如何用matlab语言编写一个用牛顿迭代法求解经过有限差分法处理过的非线性方程组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了急!!如何用matlab语言编写一个用牛顿迭代法求解经过有限差分法处理过的非线性方程组相关的知识,希望对你有一定的参考价值。
一个经过有限差分法处理的非线性方程组 比如说变量是x,y,z 但这些变量在方程组里是x(k)x(k-1)等这样表示的 比如说x(k)-x(k-1)-y(k)+z(k)=0 这样的一个方程组用牛顿迭代法解 如何编写代码 方程组 雅克比矩阵如何表示 望高人指点 最好举个列子(有代码)
参考技术A程序很简单的,有点基础的都能编。但是有一个点必须提醒你,Jacobe矩阵的计算。
两种方法:
解析Jacobe。就是需要你具体的研究非线性方程组的解析表达式,通过求导的方法,得到解析表示的Jacobe矩阵。
数值Jacobe。不需要具体研究方程组的解析式,只需要一个知道输入输出关系的黑盒子。先输入一个x0,得到y0,再输入x0+dx,得到y1,dy/dx=(y1-y0)/dx,dx很小,取10E-6即可,用割线斜率代替导数。
两种给你方法都是常用的办法,各有利弊。
不好意思 可能我说的不太清楚 牛顿迭代法我懂 问题是我不知道如何用matlab语言将方程组 雅克比矩阵 以及变量编写出来 最好举个近似的实例
追答你用matlab做2个子程序function,分别用来计算函数值和雅克比,牛顿迭代法是主程序
追问两个function子程序我都知道 普通的牛顿迭代法解非线性方程组 我也会编写(变量x,y,z就单独的变量 而在方程式中没有x(k),x(k+1)等之类的) 我不知道如何编写我这样的 变量x 在方程式中就有x(k) x(k+1) x(k-1) y z 也是如x这样
追答你得确定x(k-1),x(k),x(k+1)哪个是未知量,哪个是已知量。一般来说,取x(k+1)为未知量,那么x(k),x(k-1)都是历史量,都是已知的,只需要查找内存记录。迭代计算只要关心未知量就可以了。
需要提醒你一下,做二阶以上的积分时,需要做计算启动。因为你输入的初值,只能给出一个x(0),还需要由初始的导数,倒退估算一个x(-1)。这个估算一般就是线性估算了,精度足够。有了x(-1),x(0),你才能计算x(1)。
举个例子吧(要代码) 说了这么多 看不懂
追答兄弟,写这类代码是要花钱的~~
追问钱不是问题 问题是你能不能解决问题
追答我们就是专门做求解器的
参考技术B 你的问题解决了吗Java下用牛顿迭代法实现开方
1 import java.util.Scanner; 2 3 public class sqrtNewton { 4 public static void main(String[] args) { 5 System.out.println("请输入要开方的数:"); 6 Scanner input = new Scanner(System.in); 7 double num = input.nextDouble(); 8 double e = 0.01F; 9 sqrt(num, e); 10 num = 2; 11 e = 0.0001F; 12 sqrt(num, e); 13 num = 2; 14 e = 0.00001F; 15 sqrt(num, e); 16 } 17 private static double sqrt(double num, double e) { 18 double gssn = num / 2; 19 double e0; 20 int cnt = 0; 21 do { 22 gssn= (gssn + num / gssn) / 2; 23 e0 = gssn*gssn - num; 24 cnt++; 25 System.out.printf("尝试 %f, 误差: %f\n", gssn, e0); 26 } while (e0 > e); 27 28 System.out.printf("尝试 %d 次, 结果为: %f\n", cnt, gssn); 29 return gssn; 30 } 31 }
以上是关于急!!如何用matlab语言编写一个用牛顿迭代法求解经过有限差分法处理过的非线性方程组的主要内容,如果未能解决你的问题,请参考以下文章