哪位贤才能帮我解这个方程组,需用jacobi(雅克比)迭代法求平方根且用程序实现。最好来点说明,小弟再次感激不尽

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
三种迭代法,雅克比、高斯赛贝尔、超松弛求解方程组,实验报告
下载积分:1500
内容提示:三种迭代法,雅克比、高斯赛贝尔、超松弛求解方程组,实验报告,雅克比迭代法,线性方程组的迭代法,高斯迭代法,高斯赛德尔迭代法,高斯牛顿迭代法,matlab求解方程组,线性方程组求解,非线性方程组求解,矩阵求解方程组
文档格式:DOC|
浏览次数:44|
上传日期: 08:28:30|
文档星级:
该用户还上传了这些文档
三种迭代法,雅克比、高斯赛贝尔、超松弛求解方程组,实
官方公共微信LU分解法、列主元高斯法、Jacobi迭代法、Gauss-Seidel法的原理及Matlab程序_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
LU分解法、列主元高斯法、Jacobi迭代法、Gauss-Seidel法的原理及Matlab程序
上传于||暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
下载文档到电脑,查找使用更方便
还剩6页未读,继续阅读
你可能喜欢Jacobi迭代法并行求解线性方程组 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 11时,
用akka来实现并行求解线性方程组
代码片段(2)
1.&[代码][Scala]代码&&&&
import scala.collection.immutable.Nil
import Matrix._
import akka.actor.{Props, ActorRef, Actor, ActorSystem, Kill}
import Ldpe2GActor._
object Jacobi {
def main(args: Array[String]): Unit = {
if(args.length & 1){
println(" not enough argment, usage: program inputFilePath")
println(" input file example:\n 3 \n 8 -3 2 20 \n 4 11 -1 33 \n 6 3 12 36")
//首先读取输入文件获得方程组系数矩阵和常数向量
val (matrix, vector) = Matrix(args(0))
//然后判断系数矩阵是否满足迭代收敛
if(isConvergence(matrix)){
//若满足迭代收敛则创建一个管理者actor
//然后给myActor发送一个StartCal消息
val system = ActorSystem("mySystem")
val myActor =
system.actorOf(Props(new Ldpe2GActor(matrix.matrix, vector)))
myActor ! StartCal
println("the matrix do not satisfy the condition of convergence")
//判断矩阵是否满足Jacobi迭代法收敛条件
def isConvergence(A: Matrix) = {
val D = A getDiagonal
val LU = A - D
val NLU = -1 * LU
val DI = Matrix getDiagonalReverse D
(DI * NLU).getSpectralradius & 1
//提供了这个隐式转换就可以写出上述 val NLU = -1 * LU
implicit class MaDouble(val scaler: Double) extends AnyVal{
def *(matrix: Matrix) = {
Matrix(matrix.matrix.map(row =& row.map(_ * scaler)))
//管理者actor,负责给worker actor发送计算任务和判断迭代是否继续进行
class Ldpe2GActor(val matrix: matrix,
val vector: List[Double]) extends Actor {
var times = 0
var result = Map.empty[Int, Double]
var workers = Map.empty[Int, ActorRef]
def receive = {
case StartCal =& //迭代开始前先产生足够的worker actor
val rownum = matrix.length
val x = for(i &- 0 until rownum) yield 0.0
for(i &- 0 until rownum){
workers += i -& context.actorOf(Props[Worker], name = s"worker$i")
//给worker actor发送相应计算所需的数据
//并行的思想是按行划分数据,看公式就清楚了
workers(i) ! PartialData(matrix(i), x.toList, vector(i), i)
case Result(num, localX, oldx) =& //worker actor返回的结果
val rownum = matrix.length
times += 1
result += num -& localX
//若times == rownum说明一轮迭代结束
if(times == rownum){
val newX = {for(i &- 0 until rownum) yield result(i)}.toList
val init = Math.abs(newX(0) - oldx(0))
//求的新一轮的迭代结果向量和上一轮的迭代解向量
//的差向量的最大范数
val diff =
(init /: (newX zip oldx).map(z =& Math.abs(z._1 - z._2))){
(max, elem) =& if(elem & max) elem else max
//如果差向量的最大范数diff不满足条件则继续
//下一轮迭代
if(diff & 1E-10){
for(i &- 0 until rownum)
workers(i) ! PartialData(matrix(i), newX, vector(i), i)
print("&")
for(i &- 0 until rownum - 1)
print(s"${result(i).toFloat}, ")
println(s"${result(rownum - 1).toFloat}&")
context.system.shutdown
object Ldpe2GActor {
case object StartCal
case class PartialData(row: row, x: List[Double], bv: Double, rownum: Int)
case class Result(rownum: Int, localX: Double, oldx: List[Double])
//计算每一轮迭代解向量的一个分量
class Worker extends Actor {
def receive = {
case PartialData(row, x, bv, rownum) =&
var localX = 0.0
localX = (0.0 /: (row zip x).map(z =& z._1 * z._2))(_ + _)
localX = localX - row(rownum) * x(rownum)
localX = (bv - localX) / row(rownum)
sender ! Result(rownum, localX, x)
class Matrix(val matrix: matrix) {
//矩阵减法
def -(ma: Matrix) = {
val result = (matrix zip ma.matrix).map(rows =&
(rows._1 zip rows._2).map(elems =& elems._1 - elems._2)
Matrix(result)
//矩阵乘法
def *(ma: Matrix) = {
val (row, col) = (matrix.length, matrix(0).length)
val zipElemRow = for{i &- 0 until row
j &- 0 until col
} yield ma.matrix(j).map(_ * matrix(i)(j))
var result = List[row]()
var temp = zipElemRow
for(i &- 1 to row){
result = (List[Double]() /: temp.takeRight(row))((reduce, elem) =&
reduce match {
case Nil =& elem
case _ =& (reduce zip elem).map(tu =& tu._1 + tu._2)
}) :: result
temp = temp.dropRight(row)
Matrix(result)
//获得矩阵的对角矩阵
def getDiagonal = {
matrix.length
val zeroMatrix = {
for(i &- 0 until row) yield {
for(j &- 0 until row) yield 0.0
val result = for(i &- 0 until row)
yield zeroMatrix(i).updated(i, matrix(i)(i))
Matrix(result.toList)
//幂乘法求解矩阵最大特征值,
//也就是普半径
def getSpectralradius = {
val row = matrix.length
var v = {for(i &- 0 until row) yield 1.0}.toList
val e = 0.001
var max = 0.0
var diff = 1.0
var sumList = List[Double]()
var oldMax = 0.0
while(Math.abs(diff) & e){
sumList = {
for(i &- 0 until row)
yield (0.0 /: matrix(i).map(_ * v(i)))(_ + _)
max = (sumList(0) /: sumList)((max, elem) =&
if(elem & max) elem else max)
v = sumList.map(_ / max)
diff = max - oldMax
oldMax = max
//将矩阵转换为string
override def toString = {
("" /: matrix)((s,row) =& s"$s\n${("" /: row)((acc,elem) =& s"$acc $elem")}")
//Matrix类的伴生对象
object Matrix {
type elem = Double
type row = List[elem]
type matrix = List[row]
def apply(matrix: matrix) = new Matrix(matrix)
//从文件读入数据
def apply(filename: String) = {
import java.io.BufferedReader
import java.io.FileReader
val file = new BufferedReader(new FileReader(filename))
val matrixOrder = file.readLine.toInt
val MaAndB = for(i &- 1 to matrixOrder) yield {
val temp = file.readLine.split(" ")
val doubles = temp.map(_.toDouble)
(doubles.take(matrixOrder).toList, doubles.takeRight(1)(0))
val (matrix, vector) = (MaAndB :\ (List[row](), List[Double]()))((elem, acc)
=& (elem._1 :: acc._1, elem._2 :: acc._2))
(new Matrix(matrix), vector)
//根据给定的维数生成一个单位矩阵
def getIdentity(order: Int) = {
val zeroMatrix = {
for(i &- 0 until order) yield {
for(j &- 0 until order) yield 0.0
val result = for(i &- 0 until order) yield zeroMatrix(i).updated(i, 1.0)
Matrix(result.toList)
//求解单位矩阵的逆矩阵
def getDiagonalReverse(matrix: Matrix) = {
val row = matrix.matrix.length
val reverse = for(i &- 0 until row)
yield matrix.matrix(i).updated(i, 1 / matrix.matrix(i)(i))
Matrix(reverse.toList)
inputFile.txt&~&53B&&&&
#输入文件示例
4 11 -1 33
开源中国-程序员在线工具:
相关的代码(115)
开源从代码分享开始
Ldpe2G的其它代码11501人阅读
数值分析(15)
Matlab(11)
%---雅克比迭代法-----
%---Jacobi iteration method
% A=[10,-1,-2;-1,10,-2;-1,-1,5];
% b=[72,83,42]';
A=[ 28,-3,0,0,0;
&&& -3,38,-10,0,-5;
&&& -10,0,25,-15,0;
&&& 0,0,-15,45,0;
&&& 0,-5,0,0,30];
b=[10,0,0,0,0]';
N=length(b);
fprintf('库函数计算结果:');
x=inv(A)*b&& %库函数计算结果
B=zeros(N,N);g=zeros(N,1);
x=zeros(N,1);%迭代初始值
eps=0.001;%相邻解的距离小于该数时,结束迭代
% for i=1:N
%&&&& B(i,:)=-A(i,:)/A(i,i);
%&&&& B(i,i)=0;&&&&&& %迭代矩阵
%&&&& g(i)=b(i)/A(i,i);
D=diag(diag(A));
E=-tril(A,-1);%下三角
F=-triu(A,1);%上三角
B=inv(D)*(E+F);g=inv(D)*b;
for k=1:100 %最大迭代次数为100
&&& fprintf('第%d次迭代:',k);
&&& y=B*x+g;
&&& fprintf('\n与上次计算结果的距离(2范数):%f \n',norm(x-y)^2);
&&& if norm(x-y)&eps
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:190408次
积分:2583
积分:2583
排名:第9713名
原创:68篇
转载:23篇
评论:16条
(1)(1)(1)(7)(3)(5)(10)(2)(16)(6)(1)(38)君,已阅读到文档的结尾了呢~~
精品:jacobi迭代法 非线性方程组迭代法 牛顿迭代法解方程 牛顿迭代法 matlab 超松弛迭代法 牛顿迭代法 迭代法 matlab迭代法 选权迭代法 c语言迭代法
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
Jacobi迭代法解方程组
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 迭代法求平方根 的文章

 

随机推荐