秦九韶算法 MATLAB程序
matlab秦九韶算法程序例子
matlab秦九韶算法程序例子秦九韶算法,又称为秦九韶求值算法,是一种用于求解多项式值的算法。
它可以在O(n)的时间复杂度内计算一个多项式在给定点的值,相对于普通的计算方法而言,具有更高的效率。
本文将以MATLAB语言为例,介绍秦九韶算法的实现过程,并提供一些示例代码。
1. 算法原理秦九韶算法的核心思想是利用累积计算的方式,将多项式的求值过程转化为一个累积乘法的过程。
具体而言,算法通过反复利用上一次的计算结果,不断累积乘以给定点的值,并加上下一个系数,从而逐步求得多项式在给定点的值。
2. 算法实现下面是一个简单的MATLAB函数实现秦九韶算法的例子:```matlabfunction res = evaluatePolynomial(coefficients, x)n = length(coefficients);res = coefficients(n);for i = n-1:-1:1res = res * x + coefficients(i);endend```3. 示例代码下面给出一个示例,假设我们要计算多项式P(x) = 2x^3 + 3x^2 + 4x + 5在x = 2的值,可以使用上述实现的秦九韶算法函数evaluatePolynomial:```matlabcoefficients = [2, 3, 4, 5];x = 2;result = evaluatePolynomial(coefficients, x);disp(result);```运行上述代码,输出结果为33,表示多项式在x = 2的值为33。
4. 复杂度分析根据秦九韶算法的实现,计算多项式在给定点的值的时间复杂度为O(n),其中n为多项式的阶数。
这是由于算法只需要进行一次遍历,累积乘法的操作次数与多项式的阶数相同。
5. 算法优势相对于普通的计算方法,秦九韶算法具有较高的效率。
在求解多项式值时,传统的计算方法需要进行多次乘法和加法运算,而秦九韶算法通过累积乘法的方式,大大减少了乘法和加法的次数,从而提升了计算效率。
数值上机作业1
数值计算方法课程设计姓名高振翔学号201211011066班级信计12-2成绩:1编写秦九韶算法程序,并用该程序计算多项式623)(35+-+=x x x x f 在1.3 1.2, ,1.1=x 的值function value=qinjiushao(A,x)n=length(A);F=zeros(n);F(1)=A(1);for i=1:n-1F(i+1)=F(i)*x+A(i+1);endvalue=F(n)disp('真值')polyval(A,x)程序:function s=qinjiuzhao(a,x)n=length(a);s=a(1);for k=2:n;s=s*x+a(k);end3. 调试:a=[1 0 3 –2 6];s=qinjiuzhao(a,1,1)s=qinjiuzhao(a,1,2)s=qinjiuzhao(a,1,3)结果:s=9.4035 s=11.2723 s=13.70392. *用选列主元高斯消去法解线性方程组⎪⎪⎩⎪⎪⎨⎧=+-=-+-=-+-=--02 02 0 21 34343232121x x x x x x x x x x 计算的matlab 程序:tic%运行时间命令A=[-3 -1 0 0;-1 2 -1 0;0 -1 2 -1;0 0 -1 2]; b=[1 0 0 0]'; ];%A 系数矩阵,b 为n 维向量 y=inv(A)*b; %matlab 的计算结果y= -0.2667-0.2000-0.1333-0.0667n=length(b); x=zeros(n,1); %方程个数n;x 未知向量%——以下消为去过程——for k=1:n-1% if A(k,k)=0;% error('Error');% endfor i=k+1:n% A(i,k)=A(i,k)/A(k,k);Aik=A(i,k)/A(k,k)for j=k:nA(i,j)=A(i,j)-Aik*A(k,j);endAb(i)=b(i)-Aik*b(k)endend%——回代——Aik =0.3333A =-3.0000 -1.0000 0 00 2.3333 -1.0000 00 -1.0000 2.0000 -1.00000 0 -1.0000 2.0000b =1.0000-0.3333Aik =A =-3.0000 -1.0000 0 00 2.3333 -1.0000 00 -1.0000 2.0000 -1.00000 0 -1.0000 2.0000b =1.0000-0.3333Aik =A =-3.0000 -1.0000 0 00 2.3333 -1.0000 00 -1.0000 2.0000 -1.00000 0 -1.0000 2.0000b =1.0000-0.3333Aik =-0.4286A =-3.0000 -1.0000 0 00 2.3333 -1.0000 00 0 1.5714 -1.00000 0 -1.0000 2.0000b =1.0000-0.3333-0.1429Aik =A =-3.0000 -1.0000 0 00 2.3333 -1.0000 00 0 1.5714 -1.00000 0 -1.0000 2.0000b =1.0000-0.3333-0.1429Aik =-0.6364A =-3.0000 -1.0000 0 00 2.3333 -1.0000 00 0 1.5714 -1.00000 0 0 1.3636b =1.0000-0.3333-0.1429-0.0909>> x(n)=b(n)/A(n,n)x =-0.0667>> for k=n-1:-1:1S=b(k);for j=k+1:nS=S-A(k,j)*x(j);endx(k)=S/A(k,k)endx =-0.1333-0.0667x =-0.2000-0.1333-0.0667x =-0.2667-0.2000-0.1333-0.0667>> xx =-0.2667-0.2000-0.1333-0.0667>> error=abs(x-ones(n,1)) ))%误差error =1.26671.20001.13331.0667toc%运行时间命令运行时间:348.6710结构分析:在用高斯消去法求解方程组的解,化为阶梯型时,主元过小可能产生麻烦,会产生很大的误差,既小主元要在分母上,产生的误差变化很大,所以应避免采用绝对值最小的主元素,对于一般矩阵来说,最好每一步选取系数矩阵或消元后的低阶矩阵中绝对值最大的元素作为主元素,使高斯消去法具有较好的稳定性,主要使用列主元消去法!小结:在求解方程组时,使用列主元消去法,先判定方程组的系数矩阵非奇异,然后进行行变换,按列主元消去法化为阶梯型,当计算到系数行列式为0时计算停止,然后在回代求解最终求得原方程组的解。
§75秦九韶算法
§75秦九韶算法§75秦九韶算法──求多项式的值一、泰勒定理简介二、求多项式值的求法三、秦九韶算法1.直接法2.累乘法3.秦九韶算法1.步骤2.编程复杂函数多项式函数泰勒定理先改后算两大步降幂提因○补缺由内到外逐层算人工递推系数表4.其他法递推公式法人工系数表法三大语言三结构五种语句三案例高考主流是框图循环结构是重点辗转相除法与更相减损术进位制秦九韶算法注4:注1:自然语言框图程序设计语言注2:顺序结构条件结构循环结构输入语句注3:赋值语句输出语句条件语句循环语句───求最大公约数───求多项式的值框图的画法是次要的重点是要能看懂框图2.辗转相除法1.短除法求最大公约数的方法3.更相减损术数字较小短除法公质因数连续除除到所有商互质除数连乘是答案大除小余换大辗转除何时停0或11互质0除数即答案大减小差换大连续减何时停两相等即答案若可半可省功注:辗转相除法与更相减损术的异同点1.辗转相除法以除法运算为主3.两法本质上都是递推,都可用循环结构编程更相减损术以减法运算为主2.辗转相除法当除法运算余数为O或1时终止运算更相减损术当减法运算差为O时终止运算§75秦九韶算法──求多项式的值一、泰勒定理简介二、求多项式值的求法三、秦九韶算法1.直接法2.累乘法3.秦九韶算法1.步骤2.编程复杂函数多项式函数泰勒定理先改后算两大步降幂提因○补缺由内到外逐层算人工递推系数表4.其他法递推公式法人工系数表法常见的多项式(整式)函数我省的大压轴题,每年都是以三次函数来说事2013年的全国Ⅰ卷的小压轴题,是四次函数泰勒中值定理一、泰勒定理简介复杂函数多项式函数泰勒定理②n越大越精确①阶乘的概念:参课本P:32练习2麦克劳林公式一、泰勒定理简介复杂函数多项式函数泰勒定理1.直接法2.累乘法3.秦九韶算法最多n(n+1)/2次乘法,n次加法最多n次乘法,n次加法xn=(xn-1)xxn-1=(xn-2)xxn-2=(xn-3)x…二、求多项式值的求法4.其他法例如当n=10时……引例.求f(x)=x5+x4+x3+x2+x+1当x=5时的值直接法f(5)=55+54+53+52+5+1=3125+625+125+25+5+1=3906累乘法f(5)=55+54+53+52+5+1+5+1□=+□+□+□251253125625=3906引例.求f(x)=x5+x4+x3+x2+x+1当x=5时的值秦九韶算法f(5)=55+54+53+52+5+1=5×(54+53+52+5+1)+1=5×(5×(53+52+5+1)+1)+1=5×(5×(5×(52+5+1)+1)+1)+1=5×(5×(5×(5×(5+1)+1)+1)+1)+1=5×(5×(5×(5×6+1)+1)+1)+1=5×(5×(5×31+1)+1)+1=5×(5×156+1)+1=5×781+1=3906先改后算迭代法降幂提因○补缺由内到外逐层算人工递推系数表后算先改可以看出,该算法是:将求一个5次多项式f(x)的值转化成了求5个一次多项式的值的方法引例.求f(x)=x5+x4+x3+x2+x+1当x=5时的值1.直接法2.累乘法f(5)=55+54+53+52+5+13.秦九韶算法4.其他法55,54,53,52,5,1应用等比数列的求和公式最简洁吧秦九韶算法:设是一个n次的多项式先对该多项式按下面的方式进行改写:先改后算两大步降幂提因○补缺由内到外逐层算如何求该多项式的值呢?最后一项Vn是所求值秦九韶算法是将求一个n次多项式f(x)的值转化成了,求n个一次多项式的值的方法。
秦九韶算法matlab程序写法
文章标题:深入探讨秦九韶算法的Matlab程序写法在数学领域中,秦九韶算法是一个非常重要的算法,主要用于多项式的快速计算和求值。
它由我国古代数学家秦九韶所发明,是一种十分高效的多项式求值方法。
在本文中,我们将深入探讨秦九韶算法的Matlab程序写法,通过具体的代码示例和讲解,帮助读者更好地理解和掌握这一算法。
1. 算法原理让我们简要回顾一下秦九韶算法的原理。
该算法的核心思想是通过不断的迭代和累乘来求解多项式的值,从而实现快速计算。
其数学原理是利用了多项式的因式分解性质,通过减少乘法次数来提高计算效率。
2. Matlab程序实现接下来,我们将展示秦九韶算法在Matlab中的具体实现方法。
我们需要定义一个多项式的系数向量,假设为coeffs,其中 coeffs(i) 表示多项式中 x 的 i 次幂的系数。
我们可以使用如下的Matlab代码来实现秦九韶算法:```matlabfunction result = qinjiushao(coeffs, x)n = length(coeffs);b = coeffs(n);for i = n-1:-1:1b = coeffs(i) + x * b;endresult = b;```在这段代码中,我们定义了一个名为 qinjiushao 的函数,该函数接受多项式系数向量 coeffs 和自变量 x 作为输入,然后利用秦九韶算法来计算多项式在给定自变量下的值,并将结果保存在 result 中。
通过从高次幂到低次幂的顺序累乘和累加,最终得到多项式的求值结果。
3. 代码解释让我们逐行解释一下这段代码的实现细节。
我们获取系数向量的长度n,并将最高次幂的系数赋给变量 b。
我们使用 for 循环从 n-1 次幂开始逐次迭代,每次将之前的结果乘以 x 并加上新的系数值。
我们将得到多项式在给定自变量下的值,并将其保存在 result 中返回。
4. 个人观点对于秦九韶算法的Matlab程序写法,我认为需要注意的是在实现过程中要遵循算法的核心原理,即通过迭代和累乘来求解多项式的值。
matlab秦九韶算法程序例子
matlab秦九韶算法程序例子Matlab中的秦九韶算法是一种用于快速计算多项式的算法。
在这篇文章中,我将列举十个使用Matlab实现秦九韶算法的例子,并详细解释每个例子的实现过程和结果。
1. 一元多项式求值考虑一个一元多项式P(x) = 2x^3 + 3x^2 + 4x + 5,我们可以使用秦九韶算法来计算P(x)在x=2处的值。
首先,将多项式的系数存储在一个向量coeff中,然后使用秦九韶算法求解:```matlabcoeff = [2, 3, 4, 5];x = 2;result = coeff(1);for i = 2:length(coeff)result = result*x + coeff(i);enddisp(result);```结果为31,即P(2) = 31。
2. 多项式相加考虑两个多项式P(x) = 2x^3 + 3x^2 + 4x + 5和Q(x) = 1x^2 + 2x + 3,我们可以使用秦九韶算法将它们相加。
首先,将两个多项式的系数存储在两个向量coeff1和coeff2中,然后使用秦九韶算法求解:```matlabcoeff1 = [2, 3, 4, 5];coeff2 = [1, 2, 3];result = zeros(1, max(length(coeff1), length(coeff2)));for i = 1:min(length(coeff1), length(coeff2))result(i) = coeff1(i) + coeff2(i);endif length(coeff1) > length(coeff2)result(length(coeff2)+1:end) = coeff1(length(coeff2)+1:end);elseresult(length(coeff1)+1:end) = coeff2(length(coeff1)+1:end);enddisp(result);```结果为[2, 4, 8, 8],即P(x) + Q(x) = 2x^3 + 4x^2 + 8x + 8。
秦九韶算法 MATLAB程序
中国地质大学(武汉)数值分析报告
学生姓名:张天馨
所在学院:地球物理与空间信息学院学生班级:061125
学生学号:20121002820
任课教师:付丽华
一、目的
1.熟悉Matlab的基本操作过程
2.掌握在数学领域的相关应用
二、内容
求解秦九韶算法的计算复杂度MATLAB程序设计:
>>tic;
p=input('please input p(x)='); x=input('please input x=');
n=length(p);
s(1)=p(1);
for i=1:n-1
s(i+1)=s(i)*x+p(i+1);
end
p=s(n)
toc;
程序运行结果:
三、实习总结与心得
秦九韶的算法很简单,因此在写这个程序时也并不感到十分困难。
通过这个作业我也更深刻的体会到了用计算机来解决数学问题的便携。
希望能在未来的数值分析学习中充分结合程序技能、融会贯通,用高科技去探索数学世界的奥秘。
秦九韶算法
x* 3
b0 3
b1 9
b2 25
b3 75 c2 x* 237
b4 226
b5 685
c0 x* 9
c0 3
c1 18
c1 x* 54
c2 79
c3 x* 936
c4 1162
c3 312
此处 b5
p(3) 685 c4 q(3) p ' (3) 1162
数值分析实验报告
实验序号:1 班级 实验名称 实验所用软件及版本 10 应数 A 班 姓名 秦九韶算法 Maltab 2008 梁光佐 日期:2013 年 10 月 24 日 学号 201005050110
1、实验目的 进一步理解秦九韶算法的设计思路和算法流程,培养动手实践能力和分析能力。 2、实验内容 用秦九韶算法求多项式 p( x) 3x 5 2 x 3 x 7 在 x 3 处的值。
p_x=poly2sym(A,'x') %输出原多项式 p_x_1=horner(p_x) %输出嵌套的多项式 disp('-----------------------------------------------'); p_x0=B(n) %返回 p(x0)的值 dp_x0=C(n-1) %返回 p(x)的一阶导数在 x0 处的值 计算: clear A=input('给出多项式 p(x)从高次到低次的所有系数构成矩阵,缺项系数 0 补齐\nA='); disp('-----------------------------------------------'); x0=input('给出要求解的 p(x0)的点\nx0='); disp('-----------------------------------------------'); tic qinjiushao(A,x0); toc 4、实验结果与分析 给出多项式 p(x)从高次到低次的所有系数构成矩阵,缺项系数 0 补齐 A=[3 0 -2 0 1 7] ----------------------------------------------给出要求解的 p(x0)的点 x0=3 ----------------------------------------------p_x = 3*x^5 - 2*x^3 + x + 7 p_x_1 = x*(x^2*(3*x^2 - 2) + 1) + 7 ----------------------------------------------p_x0 = 685 dp_x0 = 1162 Elapsed time is 0.101758 seconds.
秦九韶算法教学过程设计
.
为此 ,引入本课程的主题——秦九韶算法. 秦九韶 ( 公元 1 2 0 8 -1 2 6 1年 ),字道古 ,汉族 ,生于普州安岳 ( 今四川省安岳县 ) .南宋官员 、数 学家 , 与李冶 、 杨辉和朱世杰并称宋元数学 四大家.他在所著的 《 数书九章》中提出的多项式求值秦九韶 算法至今仍是 比较先进的算法.
7 4
高 师 理 科 学 刊
第 3 7卷
需 要解 决 的 问题 :给定 X,计 算 多项 式 P=a +a 1 x+… +a x ” 的值 .
学生提 出的常用方法是按照项数逐一计算 ,但是逐项生成算法面临 2 个主要问题 : ( 1 ) 一旦多项式的次数增加或者多项式 的系数被改变 ,就需要重新计算.能否设计一种算法 ,使其 不依赖于某个具体的多项式. ( 2 ) 逐项生成算法计算量 的大小.如果算法中只出现加减乘除四则运算 ,常用乘除的次数作为算法 的运算量.由于计算 a , x 需要 1 次乘法 ,计算 a 2 x 需要 2 次乘法 ,递推可得 ,利用逐项生成算法计算多项
摘 要: 为了实施四川省卓越 中学数学教师教育人才培养计划 , 针对数学与应用数 学专业 “ 园丁班” 学生特点,紧密结合中学数学,克服学生对算法以及计算机编程的畏难情绪,设计 了秦九韶算法
的教 学过程 .
关 键 词 :秦 九韶 算 法 ;教 学设 计 ;MA T L A B 中 图分 类 号 :0 2 4: G 6 4 2 . 0 文献 标识 码 :A d o i :1 0 . 3 9 6 9 / j . i s s n . 1 0 0 7 — 9 8 3 1 . 2 0 1 7 . 0 1 . 0 1 8
大连理工大学矩阵分析matlab上机作业
x(i)=1/i; %按要求给向量 x 赋值,其值递减 end normx1=norm(x,1); %求解向量 x 的 1 范数 normx1 normx2=norm(x,2); %求解向量 x 的 2 范数 normx2 normxinf=norm(x,inf); %求解向量 x 的无穷范数 normxinf normy1=norm(y,1); %求解向量 y 的 1 范数 normy1 normy2=norm(y,2); %求解向量 y 的 2 范数 normy2 normyinf=norm(y,inf); %求解向量 y 的无穷范数 normyinf z1=[normx1,normx2,normxinf]; z2=[normy1,normy2,normyinf]; end
for i=2:n
for j=i:n U(i,j)=A(i,j)-L(i,1:i-1)*U(1:i-1,j);
式
%Doolittle 分解计算上三角矩阵的公
L(j,i)=(A(j,i)-L(j,1:i-1)*U(1:i-1,i))/U(i,i); %Doolittle 分解计算下三角矩 阵的公式
end
1 1 1 ������ x = (1, 2 , 3 , … , ������) ,
������ = (1,2, … , ������)������.
对n = 10,100,1000甚至更大的n计算其范数,你会发现什么结果?你能否修改
你的程序使得计算结果相对精确呢?
1.1 源代码
function [z1,z2]=norm_vector(n) %向量 z1 的值为向量 x 的是三种范数,向量 z2 的值为向量 y 的三 种范数,n 为输入参数
秦九韶算法与进位制
算法1: 因为f(x) =x5+x4+x3+x2+x+1 所以f(5)=55+54+53+52+5+1
=3125+625+125+25+5+1 = 3906
共做了1+2+3+4=10次乘法运算,5次加法运算。
算法2: f(5)=55+54+53+52+5+1 =5×(54+53+52+5+1 ) +1 =5×(5×(53+52+5 +1 )+1 ) +1 =5×(5×(5×(52+5 +1) +1 ) +1 ) +1 =5×(5×(5×(5 ×(5 +1) +1 )+1)+1) +1
a1 k 1 a0 k 0 (10)
(an x n1 an1 x n2 a1 ) x a0
(( an x
n2
an1 x
n 3
a2 ) x a1 ) x a0
((an x an1 ) x an2 ) x a1 ) x a0
f ( x) ((an x an1 ) x an2 ) x a1 ) x a0
所以,当x = 5时,多项式的值等于17255.2
求多项式f(x)=x5+5x4+10x3+10x2+5x+1 在x=-2时的值.
【解析】f(x)=((((x+5)x+10)x+10)x+5)x+1,而x=-2,所
以有v0=1;v1=v0x+a4=1×+5=3; v2=v1x+a3=3×+10=4; v3=v2x+a2=4×+10=2; v4=v3x+a1=2×+5=1;
1.3.2算法案例2秦九韶算法
输入n,an,x的值 v=an i=n-1
i=i-1
v=vx+ai 输入ai i≥0? 否 输出v 结束 是
解法二:列表 用秦九韶算法求多项式 f(x)=2x5-5x4-4x3+3x2-6x+7当x=5时的值.
原多项式 的系数
2 x=5 2
-5 10 5
-4 25 21
3 105 108
-6 7 540 2670 534 2677
这种将求一个n次多项式f(x)的值转化成求n个 一次多项式的值的方法,称为秦九韶算法。
秦九韶算法
f ( x) 2 x 5 x 4 x 3x 6 x 7
5 4 3 2
(((( 2 x 5) x 4) x 3) x 6) x 7
问题三:用秦九韶算法计算上述多项式的值,需要多少次乘法, 多少次加法? (每运算一个一次式都进行了一次乘法运算和一次加法 运算,所以共做了5次乘法,5次加法)
问题四:怎样用秦九韶算法求 n 次多项式
f ( x ) an x an1 x
n
n 1
a1 x a0
的值?
秦九韶算法
f ( x ) an x n an1 x n1 a1 x a0
(an x n1 an1 x n 2 a1 ) x a0 ((an x n 2 an1 x n3 a2 ) x a1 ) x a0
2.用秦九韶算法求多项式f ( x) 3x 6 4 x 5 5 x 4 6 x 3 7 x 2 8 x 1当x 0.4的值时,需要做乘法和加法的 次数分别是( A.6,6 B5,6 ) C 5,5 D6,5
)
3、已知多项式f(x)=2x7-5x5+4x3+x2-x-6 用秦九韶算法求这个多项式当x=2时的值。
大连理工大学-2015年矩阵上机编程作业
} //Ax=b 的解答,A 为上三角矩阵 void SolveOne(double a[9][10],int m,int n){
int j=n-2; double answer[9]; for (int s=m-1;s>=0;s--){
answer[j]=a[s][n-1]/a[s][j]; for(int i=0;i<=s-1;i++){
} } }
} // 发现绝对值最大的元素所在一行和当前的一行做交换 void change(double a[9][10],int m,int n,int nowi,int nowj){
int record=nowi;//记录该和哪一行做交换 bool flag=true; //标志是否需要做交换 double max=a[nowi][nowj]; for(int i=nowi+1;i<m-1;i++){
}
//Gauss 消元解法 //先转化为上三角矩阵 void Gauss(double a[9][10],int m,int n){
double r[9]; //r 为每次的倍数 int k=0; for (int nowi=0,nowj=0;nowi<m-1 && nowj<n-1;nowi++,nowj++){
1. 设
, 其精确值为
.
(1) 编制按从大到小的顺序
, 计算 的通
用程序 (2) 编制按从小到大的顺序
, 计算
的通用程序
(3) 按两种顺序分别计算
并指出有效位数(编制程序时用单精度)
数值分析实验报告1
数值分析实验报告1数值分析上机实验报告(注:本实验报告中所有程序均为MATLAB语⾔程序)班级:姓名:学号:⼀章1、利⽤数值积分计算n I =21n x ex e -?dx (n=0,1,2,……). ⽬的:定积分数值求解原理:梯形公式法程序:clearformat long ;k=input('k=');m=input('m=');for n=1:kh=1/m;x=0:h:1;f=x.^n.*exp(x.^2);for i=1:ms(i)=(f(i)+f(i+1))*h/2;ends=sum(s);I(n)=exp(-1)*s;endI 运⾏结果:k=9m=1000I =Columns 1 through 60.3160604988 0.2309605799 0.1839401373 0.1535601302 0.1321211422 0.1161015912Columns 7 through 90.1036390735 0.0936475974 0.08544762262、利⽤秦九韶算法计算当0a =5,n a =21n a -+3;n=100,x=0.5;n=150,x=13多项式n p (x )=n a n x +…11n n a x --…1a x +0a 的值。
⽬的:通过调整程序以简化计算步骤,减少运算次数原理:秦久韶算法程序:n=input('n=');x=input('x=');a(1)=5;for k=1:n;a(k+1)=2.*a(k)+3;ends(n+1)=a(n+1);for i=n:-1:1s(i)=x.*s(i+1)+a(i);endPnx=s(1)运⾏结果:n=100x=0.5Pnx =802.0000000n=150x=13Pnx =1.4659714820e+2133、设0Y =28,按递推公式n Y = 1n Y -100Y ,500Y ≈27.982(五位有效数字),试问计算100Y 、500Y 将有多⼤的误差。
matlab第二次
Matlab素质拓展课第二次作业第二次课知识点if 选择语句for while 循环语句子函数(多个输入参数输出参数)递归二分法秦九韶算法等3.3 写一个名为nexthour的函数,接收一个整数参数,该参数是一天内的某个小时,然后返回下一个小时。
假定是12小时制,所以例子中12的下一个小时是1.% 3.3 写一个名为nexthour的函数,% 接收一个整数参数,该参数是一天内的某个小时,然后返回下一个小时。
% 假定是12小时制,所以例子中12的下一个小时是1.function y=nexthour(n)if n>=1&&n<=11y=n+1;elseif n==12y=1;elsey=-1;disp('输入错误!');endend3.6 写一个脚本,提示用户输入分数的分子和分母。
如果分母是0,则打印错误信息,指出0不能做分母。
如果分母不是0,则打印分数的结果。
% 3.6 写一个脚本,提示用户输入分数的分子和分母。
% 如果分母是0,则打印错误信息,指出0不能做分母。
% 如果分母不是0,则打印分数的结果。
clc;clear;fenzi=input('请输入分子:');fenmu=input('\n请输入分母:');if fenmu==0disp('打印错误!分母不能为0!')elsefprintf('分数=%d/%d\n',fenzi,fenmu);end3.11 写一个函数createMToN,它能够创建并返回一个从m到n的整数组成的向量(m是第一个输入参数,n是第二个),不管m是小于n还是大于n。
如果m等于n,该向量正好是1*1的,或者说是标量。
%dy_chapter3_11.m cerateMToNfunction vec=dy_chapter3_11(m,n)if m>nvec=m:-1:n;elseif mvec=m:n;elsevec=m;end3.17 写一个脚本,它能生产一个随机整数,并且打印该随机整数是一个偶数还是一个奇数。
matlab 秦和韶方法求多项式
在数值分析领域中,MATLAB中的秦和韶方法是一种常用的求多项式值的数值计算方法。
这种方法通过递推的方式,可以高效地求解多项式在给定点处的值,是数值计算中的重要工具之一。
1. 秦和韶方法的原理秦和韶方法是一种用于计算多项式在某一点的值的数值计算方法。
其基本原理是通过递推的方式,将多项式的系数依次代入到一个递推公式中,从而得到多项式在指定点处的值。
这种方法可以大大减少计算量,提高计算效率。
对于一个n次多项式f(x)=a0x^n + a1x^(n-1) + ... + an-1x + an,假设要计算多项式在点x=c处的值,秦和韶方法的递推公式可以表示为:f(c) = an + c(an-1 + c(an-2 + ... + c(a1 + can)...))2. 秦和韶方法的实现在MATLAB中,可以通过编写相应的函数来实现秦和韶方法。
首先需要将多项式的系数表示为一个数组,然后利用循环或递归的方式,根据秦和韶方法的递推公式依次计算多项式在指定点处的值。
以下是一个简单的MATLAB代码示例,实现了秦和韶方法的多项式求值:```matlabfunction result = evaluate_polynomial(coefficients, point)n = length(coefficients);result = coefficients(n);for i = n-1:-1:1result = result * point + coefficients(i);endend```在这个代码中,coefficients为多项式的系数数组,point为要求多项式值的指定点。
通过循环计算,即可得到多项式在指定点处的值。
3. 秦和韶方法的应用秦和韶方法在实际应用中具有广泛的用途,特别是在科学计算和工程技术领域。
在信号处理、数值模拟、图像处理等领域,多项式的求值是一个常见的计算问题,而秦和韶方法可以提供高效的计算方式。
数值计算方法实验指导(Matlab版)讲解
《数值计算方法》实验指导(Matlab版)肇庆学院数学与统计学学院计算方法课程组《数值计算方法》实验1报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验1 算法设计原则验证(之相近数相减、大数吃小数和简化计算步骤) 2. 实验题目(1) 取1610=z ,计算z z -+1和)1/(1z z ++,验证两个相近的数相减会造成有效数字的损失.(2) 按不同顺序求一个较大的数(123)与1000个较小的数(15310-⨯)的和,验证大数吃小数的现象.(3) 分别用直接法和秦九韶算法计算多项式n n n n a x a x a x a x P ++++=--1110)(在x =1.00037处的值.验证简化计算步骤能减少运算时间.对于第(3)题中的多项式P (x ),直接逐项计算需要2112)1(+=+++-+n n n 次乘法和n 次加法,使用秦九韶算法n n a x a x a x a x a x P ++++=-)))((()(1210则只需要n 次乘法和n 次加法. 3. 实验目的验证数值算法需遵循的若干规则. 4. 基础理论设计数值算法时,应避免两个相近的数相减、防止大数吃小数、简化计算步骤减少运算次数以减少运算时间并降低舍入误差的积累.两相近的数相减会损失有效数字的个数,用一个大数依次加小数,小数会被大数吃掉,乘法运算次数太多会增加运算时间. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab6. 实验过程(1) 直接计算并比较;(2) 法1:大数逐个加1000个小数,法2:先把1000个小数相加再与大数加; (3) 将由高次项到低次项的系数保存到数组A[n]中,其中n 为多项式次数.7. 结果与分析(1) 计算的z z -+1= ,)1/(1z z ++ .分析:(2) 123逐次加1000个6310-⨯的和是 ,先将1000个6310-⨯相加,再用这个和与123相加得.分析:(3) 计算次的多项式:直接计算的结果是,用时;用秦九韶算法计算的结果是,用时.分析:8. 附录:程序清单(1) 两个相近的数相减.%*************************************************************%* 程序名:ex1_1.m *%* 程序功能:验证两个相近的数相减会损失有效数字个数*%*************************************************************z=1e16;x,y======================================================================(2) 大数吃小数%*************************************************************%* 程序名:ex1_2.m *%* 程序功能:验证大数吃小数的现象. *%*************************************************************clc; % 清屏clear all; % 释放所有内存变量format long; % 按双精度显示浮点数z=123; % 大数t=3e-15; % 小数x=z; % 大数依次加小数% 重复1000次给x中加上ty=0; % 先累加小数% 重复1000次给y中加上ty=z + y; % 再加到大数x,y======================================================================(3) 秦九韶算法%*************************************************************%* 程序名:ex1_3.m *%* 程序功能:验证秦九韶算法可节省运行时间. *%*************************************************************clc; % 清屏clear all; % 释放所有内存变量format long; % 按双精度显示浮点数A=[8,4,-1,-3,6,5,3,2,1,3,2,-1,4,3,1,-2,4,6,8,9,50,-80,12,35,7,-6,42,5,6,23,74,65,55,80,78,77,98,56]; A(10001)=0; % 扩展到10001项,后面的都是分量0% A为多项式系数,从高次项到低次项x=1.00037;n=9000; % n为多项式次数% 直接计算begintime=clock; % 开始执行的时间% 求x的i次幂% 累加多项式的i次项endtime=clock; % 结束执行的时间time1=etime(endtime,begintime); % 运行时间disp('直接计算');disp(['p(',num2str(x),')=',num2str(p)]);disp([' 运行时间: ',num2str(time1),'秒']);% 秦九韶算法计算begintime=clock; % 开始执行的时间% 累加秦九韶算法中的一项endtime=clock; % 结束执行的时间time2=etime(endtime,begintime); % 运行时间disp(' ');disp('秦九韶算法计算');disp(['p(',num2str(x),')=',num2str(p)]);disp([' 运行时间: ',num2str(time2),'秒']);《数值计算方法》实验1报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验1 算法设计原则验证(之数值稳定性) 2. 实验题目 计算定积分⎰==-1110,1,0,d n x e xI x nn ,分别用教材例1-7推导出的算法A 和B ,其中:算法A :⎩⎨⎧≈-=-6321.0101I nI I n n 算法B :⎪⎩⎪⎨⎧≈-=-0)1(1101I I nI n n 验证算法不稳定时误差会扩大.3. 实验目的验证数值算法需遵循的若干规则. 4. 基础理论设计数值算法时,应采用数值稳定性好的算法.数值稳定的算法,误差不会放大,甚至会缩小;而数值不稳定的算法会放大误差. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab6. 实验过程分别用数组IA[ ]和IB[ ]保存两种算法计算的结果. 7. 结果与分析8. 附录:程序清单%*************************************************************%* 程序名:ex1_4.m *%* 程序功能:验证数值稳定性算法可控制误差. *%*************************************************************clc; % 清屏clear all; % 释放所有内存变量format long; % 按双精度显示浮点数I=[0.63212055882856, 0.36787944117144, 0.26424111765712, 0.20727664702865, ...0.17089341188538, 0.14553294057308, 0.12680235656154, 0.11238350406938, ... 0.10093196744492, 0.09161229300662, 0.08387707010843];% 保留14位小数的精确值, …是Matlab中的续行符% 算法AIA(1) = 0.6321; % Matlab下标从1开始,所以要用IA(n+1)表示原问题中的I(n)% 算法Bdisp('n 算法A 算法B 精确值');for n=1:11fprintf('%2d %14.6f %14.6f %14.6f\n',n-1,IA(n),IB(n),I(n));end% n显示为2位整数, 其它显示为14位其中小数点后显示6位的小数《数值计算方法》实验1报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验1 算法设计原则(除数绝对值不能太小) 2. 实验题目将线性方程组增广矩阵利用初等行变换可化为⎪⎪⎭⎫⎝⎛→-⎪⎪⎭⎫ ⎝⎛→-⎪⎪⎭⎫ ⎝⎛''0'0''02221112'12221121112222211121122121121b a b a r r b a b a a r r b a a b a a a a a a 由此可解得'/',/'22221111a b x a b x ==.分别解增广矩阵为161011212-⎛⎫ ⎪⎝⎭和162121011-⎛⎫⎪⎝⎭的方程组,验证除数绝对值远小于被除数绝对值的除法会导致结果失真. 3. 实验目的验证数值算法需遵循的若干规则. 4. 基础理论设计数值算法时,应避免除数绝对值远小于被除数绝对值的除法,否则绝对误差会被放大,使结果失真. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab6. 实验过程用二维数组A 和B 存放方程组的增广矩阵,利用题目所给初等行变换求解方程组. 7. 结果与分析第1种顺序的方程组的解为x = ,y = ;第2种顺序的方程组的解为x = ,y = . 分析:8. 附录:程序清单%************************************************************* %* 程 序 名:ex1_5.m * %* 程序功能:验证除数的绝对值太小可能会放大误差. * %*************************************************************clc;A=[1e-16, 1, 1; 2, 1, 2];B=[2, 1, 2; 1e-16, 1, 1]; % 增广矩阵% 方程组A% m = - a_{21}/a_{11} 是第2行加第1行的倍数% 消去a_{21}% m = - a_{12}/a_{22} 是第1行加第2行的倍数% 消去a_{12}, 系数矩阵成对角线% 未知数x1的值% 未知数x2的值disp(['方程组A的解: x1=',num2str(A(1,3)),', x2=',num2str(A(2,3))]);disp(' ');% 方程组B% m = - b_{21}/b_{11} 是第2行加第1行的倍数% 消去b_{21}% m = - b_{12}/b_{22} 是第1行加第2行的倍数% 消去b_{12}, 系数矩阵成对角线% 未知数x1的值% 未知数x2的值disp(['方程组B的解: x1=',num2str(B(1,3)),', x2=',num2str(B(2,3))]);《数值计算方法》实验2报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验2 非线性方程的迭代解法(之简单迭代法) 2. 实验题目用简单迭代法求方程010423=-+x x 在区间[1,2]内的一个实根,取绝对误差限为410-.3. 实验目的掌握非线性方程的简单迭代法. 4. 基础理论简单迭代法:将方程0)(=x f 改写成等价形式)(x x ϕ=,从初值0x 开始,使用迭代公式)(1k k x x ϕ=+可以得到一个数列,若该数列收敛,则其极限即为原方程的解.取数列中适当的项可作为近似解. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程7. 结果与分析8. 附录:程序清单班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验2 非线性方程的迭代解法(之Newton 迭代法) 2. 实验题目用Newton 迭代法求方程010423=-+x x 在区间[1,2]内的一个实根,取绝对误差限为410-.3. 实验目的掌握求解非线性方程的Newton 迭代法. 4. 基础理论Newton 迭代法:解方程0)(=x f 的Newton 迭代公式为)(')(1k k k k x f x f x x -=+.5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程7. 结果与分析8. 附录:程序清单班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验2 非线性方程的迭代解法(之对分区间法) 2. 实验题目用对分区间法求方程310x x --=在区间[1, 1.5]内的一个实根,取绝对误差限为410-. 3. 实验目的掌握求解非线性方程的对分区间法. 4. 基础理论对分区间法:取[a ,b ]的中点p ,若f (p ) ≈ 0或b – a < ε,则p 为方程0)(=x f 的近似解; 若f (a ) f (p ) < 0,则说明根在区间取[a ,p ]中;否则,根在区间取[p ,b ]中.将新的有根区间记为 [a 1,b 1],对该区间不断重复上述步骤,即可得到方程的近似根. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程用宏定义函数f (x );为了循环方便,得到的新的有根区间始终用[a ,b ]表示; 由于新的有根区间可能仍以a 为左端点,这样会反复使用函数值f (a ),为减少运算次数,将这个函数值保存在一个变量fa 中;同样在判断新的有根区间时用到函数值f (p ),若新的有根区间以p 为左端点,则下一次用到的f (a )实际上就是现在的f (p ),为减少运算次数,将这个函数值保存在一个变量fp 中.算法的伪代码描述:Input :区间端点a ,b ;精度要求(即误差限)ε;函数f (x );最大对分次数N7. 结果与分析8. 附录:程序清单说明: 源程序中带有数字的空行,对应着算法描述中的行号%**********************************************************%* 程序名:Bisection.m *%* 程序功能:使用二分法求解非线性方程. *%**********************************************************f=inline('x^3-x-1'); % 定义函数f(x)a=input('有根区间左端点: a=');b=input('右端点:b=');epsilon=input('误差限:epsilona=');N=input('最大对分次数: N=');1 % 对分次数计数器n置12 % 左端点的函数值给变量fafprintf('\n k p f(p) a(k) f(a(k))');fprintf(' b(k) b-a\n');% 显示表头fprintf('%2d%36.6f%12.6f%12.6f%12.6f\n',0,a,fa,b,b-a);% 占2位其中0位小数显示步数0, 共12位其中小数6位显示各值3 % while n≤ N4 % 取区间中点p5 % 求p点函数值给变量fpfprintf('%2d%12.6f%12.6f',n,p,fp); % 输出迭代过程中的中点信息p和f(p)6 % 如果f(p)=0或b-a的一半小于误差限εfprintf('\n\n近似解为:%f\n',p); % 则输出近似根p (7)return; % 并结束程序(7)89 % 计数器加110 % 若f(a)与f(p)同号11 % 则取右半区间为新的求根区间, 即a取作p12 % 保存新区间左端点的函数值13 % 否则14 % 左半区间为新的求根区间, 即b取作p15fprintf('%12.6f%12.6f%12.6f%12.6f\n',a,fa,b,b-a);% 显示新区间端点及左端函数值、区间长度16fprintf('\n\n经过%d次迭代后未达到精度要求.\n',N); % 输出错误信息(行17)《数值计算方法》实验2报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验2 非线性方程的迭代解法(之Aitken-Steffensen 加速法) 2. 实验题目用Aitken-Steffensen 加速法求方程010423=-+x x 在区间[1,2]内的一个实根,取绝对误差限为410-.3. 实验目的熟悉求解非线性方程的Aitken-Steffensen 加速法. 4. 基础理论将方程0)(=x f 改写成等价形式)(x x ϕ=,得到从初值0x 开始的迭代公式)(1k k x x ϕ=+后,基于迭代公式)(1k k x x ϕ=+的Aitken-Steffensen 加速法是通过“迭代-再迭代-加速”完成迭代的,具体过程为kk k k k k k k k k k x y z z y x x y z x y +---===+2)(),(),(21ϕϕ. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程为了验证Aitken-Steffensen 加速法可以把一些不收敛的迭代加速成迭代收敛,我们使用将方程组变形为31021x x -=,取迭代函数31021)(x x -=ϕ,并利用宏定义出迭代函数.由于不用保存迭代过程,所以用x0表示初值同时也存放前一步迭代的值,y 和z 是迭代过程中产生的y k 和z k ,x 存放新迭代的结果.算法的伪代码描述:Input :初值x 0;精度要求(即误差限)ε;迭代函数φ(x );最大迭代次数N7. 结果与分析8. 附录:程序清单%*************************************************************%* 程序名:Aitken_Steffensen.m *%* 程序功能:用Aitken-Steffensen加速法求方程. *%*************************************************************clc;clear all;phi=inline('0.5 * sqrt( 10 - x^3)'); % 迭代函数x0=input('初值: x0 = ');epsilon=input('误差限: epsilon=');N=input('最大迭代次数: N=');disp(' n 迭代中间值y(n-1) 再迭代结构z(n-1) 加速后的近似值x(n)');fprintf('%2d%54.6f\n',0,x0);% 占2位整数显示步数0, 为了对齐, 占54位小数6位显示x01 % n是计数器2 % while n<=Ny= 3 ; % 迭代z= 3 ; % 再迭代x= 3 ; % 加速% x0初值及前一步的近似值, y和z是中间变量, x是下一步的近似值fprintf('%2d%18.6f%18.6f%18.6f\n',n,y,z,x);% 显示中间值和迭代近似值6 % 如果与上一步近似解差的绝对值不超过误差限fprintf('\n\n 近似解x≈x(%d)≈%f\n',n,x);% 则输出近似根(7),可简略为: fprintf('\n\n近似解x=%f',x);return; % 并结束程序(7)8 % 相当于endif9 % 计数器加110 % 新近似值x作为下一次迭代的初值11fprintf('\n 迭代%d次还不满足误差要求.\n\n',N); %输出错误信息(12)《数值计算方法》实验2报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验2 非线性方程的迭代解法(之Newton 下山法) 2. 实验题目用Newton 下山法求方程010423=-+x x 在区间[1,2]内的一个实根,取绝对误差限为410-.3. 实验目的熟悉非线性方程的Newton 下山法. 4. 基础理论Newton 下山法:Newton 下山法公式为)(')(1k k kk k x f x f x x λ-=+,使|)(||)(|1k k x f x f <+,其中10≤<k λ.5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程定义函数f(x)和df(x),其中df(x)是f(x)的导函数.每步迭代时先取下山因子为1,尝试迭代,判断尝试结果是否满足下山因子,若满足则作为这步的迭代结果;否则将下山因子减半,然后再尝试.为防止当前的x k 是极小值点,附近不会有满足下述条件的其它点,使尝试陷入死循环,同时计算机中能表示出的浮点数也有下界,因此我们设置了最大尝试次数.当超过最大尝试次数时,不再进行下山尝试.由于反复尝试迭代且要判断下山条件,所以f (x 0)和f ‘(x 0)会反复使用,为避免重复计算浪费运行时间,将这两个值分别保存在变量fx0和dfx0.而尝试产生的节点,判断下山条件时要用到它的函数值,若尝试成功,这个点会作为下一步的初值再使用,所以把该点的函数值也保存在变量fx 中.算法的伪代码描述:Input :初值x 0;精度要求(即误差限)ε;函数及其导函数f (x )和f’(x);最大迭代次数N ;K 下山尝试最大次数7. 结果与分析8. 附录:程序清单%************************************************************* %* 程序名:NewtonDownhill.m * %* 程序功能:用Newton下山法求解非线性方程. * %*************************************************************clc;clear all;f=inline('x^3-x-1'); % 函数f(x)df=inline('3*x^2-1'); % 函数f(x)的导函数x0=input('初值: x0 = ');epsilon=input('误差限: epsilon=');N=input('最大迭代次数: N=');K=input('最大下山尝试次数: K=');1 % 迭代次数计数器2 % 存x0点函数值fprintf('\n\n n x(n) f(x(n))\n'); % 显示表头fprintf('%2d%14.6f%14.6f\n',0,x0,fx0); % 2位整数显示0, 共14位小数6位显示x0和fx03 % while n ≤ Ndisp(''); % 换行显示下山尝试过程的表头disp(' 下山因子尝试x(n) 对应f(x(n)) 满足下山条件');disp('');4 % 存x0点导数值, 每次下山尝试不用重新计算if dfx0==0 % 导数为0不能迭代disp(‘无法进行Newton迭代’);return;endlambda=1.0; % 下山因子从1开始尝试k=1; % k下山尝试次数计数器while k<=K % 下山最多尝试K次% 下山公式fx=f(x); % 函数值fprintf('%22.6f%14.6f%14.6f',lambda,x,fx); % 显示尝试结果if (abs(fx)<abs(fx0)) % 判断是否满足下山条件fprintf(' 满足\n');break; % 是, 则退出下山尝试的循环elsefprintf(' 不满足\n');endlambda=lambda/2; % 不是, 则下山因子减半k=k+1; % 计数器加1endif k>Kfprintf('\n 下山条件无法满足, 迭代失败.\n\n');return;endfprintf('%2d%14.6f%14.6f\n',n,x,fx);% 2位整数显示步数n, 共14位小数6位显示下步迭代结果22 % 达到精度要求否fprintf('\n\n 方程的近似解为: x≈%f\n\n',x); % (23)return; % 达到, 则显示结果并结束程序(23) end % (24)% 用x0,fx0存放前一步的近似值和它的函数值, 进行循环迭代25262728fprintf('\n 迭代%d次还不满足误差要求.\n\n',N);《数值计算方法》实验2报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验2 非线性方程的迭代解法(之弦截法) 2. 实验题目用弦截法求方程010423=-+x x 在区间[1,2]内的一个实根,取绝对误差限为410-. 3. 实验目的熟悉非线性方程的弦截法. 4. 基础理论将Newton 迭代法中的导数用差商代替,得到弦截法(或叫正割法)公式)()()(111k k k k k k k x f x f x f x x x x --+---=.5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程不保存迭代过程,所以始终以x 0和x 1分别存放x k -1和x k ,而x 存放新产生的迭代值x k +1,这样,下一次迭代时需要把上一步的x 1(即x k )赋值于x 0(做新的x k -1).这些点的函数值会重复用到,在迭代公式中也要用到,上一步的x 1作为下一步的x 0也会再一次用它的函数值,为减少重新计算该点函数值的运行时间,将x 1点的函数值保存在变量fx1中.算法的伪代码描述:Input :初值x 0,x 1;精度要求(即误差限)ε;函数f (x );最大迭代次数N7. 结果与分析8. 附录:程序清单%*************************************************************%* 程序名:SecantMethod.m *%* 程序功能:用弦截法求解非线性方程. *%*************************************************************clc;clear all;f=inline('2*x^3-5*x-1'); % 函数f(x)x0=input('第一初值: x0 = ');x1=input('第二初值: x1 = ');epsilon=input('误差限: epsilon=');N=input('最大迭代次数: N=');fprintf('\n n x(n)\n'); % 显示表头fprintf('%2d%14.6f\n', 0, x0); % 占2位显示步数0, 共14位其中小数6位显示x0 fprintf('%2d%14.6f\n', 1, x1); % 占2位显示步数1, 共14位其中小数6位显示x11 % 存x0点函数值2 % 存x1点函数值3 % 迭代计数器4 % while n ≤ N% 弦截法公式fprintf('%2d%14.6f\n', n, x); % 显示迭代过程6 % 达到精度要求否fprintf('\n\n 方程的近似解为: x≈%f\n\n', x);return; % 达到, 则显示结果并结束程序89 % 原x1做x0为前两步的近似值10 % 现x做x1为一两步的近似值11 % x0点函数值12 % 计算x1点函数值, 为下一次循环13 % 计数器加114fprintf('\n 迭代%d次还不满足误差要求.\n\n',N);《数值计算方法》实验3报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验3 解线性方程组的直接法(之Gauss 消去法) 2. 实验题目用Gauss 消去法求解线性方程组⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--000.3000.2000.1643.5072.1000.2623.4712.3000.1000.3000.2001.0321x x x . 3. 实验目的掌握解线性方程组的Gauss 消去法. 4. 基础理论Gauss 消去法是通过对增广矩阵的初等行变换,将方程组变成上三角方程组,然后通过回代,从后到前依次求出各未知数.Gauss 消去法的第k 步(1≤k≤n -1)消元:若0≠kk a ,则依次将增广矩阵第k 行的kkik a a /-倍加到第i 行(k+1≤i≤n ),将第k 列对角线下的元素都化成0. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程7. 结果与分析8. 附录:程序清单班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验3 解线性方程组的直接法(之Gauss 列主元消去法) 2. 实验题目用Gauss 列主元消去法求解线性方程组⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--000.3000.2000.1643.5072.1000.2623.4712.3000.1000.3000.2001.0321x x x . 3. 实验目的掌握解线性方程组的Gauss 列主元消去法. 4. 基础理论Gauss 列主元消去法也是通过对增广矩阵的初等行变换,将方程组变成上三角方程组,然后通过回代,从后到前依次求出各未知数.Gauss 列主元消去法的第k 步(1≤k≤n -1)消元:先在nk k k kk a a a ,,,,1 +中找绝对值最大的,将它所在的行与第k 行交换,然后将第k 行的kk ik a a /-倍加到第i 行(k+1≤i≤n ),将第k 列对角线下的元素都化成0. 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程7. 结果与分析8. 附录:程序清单班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验3 解线性方程组的直接法(之Doolittle 分解) 2. 实验题目对矩阵A 进行Doolittle 分解,其中⎪⎪⎪⎪⎪⎭⎫⎝⎛----=3101141101421126A .3. 实验目的掌握矩阵的Doolittle 分解. 4. 基础理论矩阵的Doolittle 分解是指将矩阵n n ij a A ⨯=)(可以分解为一个单位下三角矩阵和一个上三角矩阵的乘积.若设⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=nn n n n n n n u u u u u u u u u u U l l ll l l L000000,1010010001333223221131211321323121则可依如下顺序公式计算⎪⎪⎩⎪⎪⎨⎧++=-=+=-=∑∑-=-=1111,,2,1,/)(,,1,,k t kk tk it ik ik k r rj kr kj kj nk k i u u l a l nk k j u l a u其中k = 1,2,…,n .5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程(1)按计算公式依次计算一行u 同时计算一列l ;(2)因为计算完u ij (或l ij )后,a ij 就不再使用,为节省存储空间,将计算的u ij (和l ij )仍存放在矩阵A 中的相应位置;(3)使用L 矩阵和U 矩阵时需要根据元素所在位置取固定值或A 中相应位置的值.L 对角线上的元素为1,上三角部分为0,下三角部分为A 中对应的元素;U 的下三角部分为0,上三角部分为A 中对应的元素.算法的伪代码描述:Input:阶数n;矩阵A7. 结果与分析8. 附录:程序清单%****************************************************% 程序名: Doolittle.m *% 程序功能: 矩阵LU分解中的Doolittle分解. *%****************************************************clc;clear all;n=4; % 矩阵阶数A=[6 2 1 -1;2 4 1 0; 1 1 4 -1; -1 0 -1 3]disp('A=');disp(A);% LU分解(Doolittle分解)for k=1:n% 计算矩阵U的元素u_{kj}% (可参照下面l_{ik}的公式填写)% 计算矩阵L的元素l_{ik}% L在A下三角, U在上三角(对角线为1) enddisp('分解结果:');disp('L=');for i=1:nfor j=1:nif i>j % 在下三角部分, 则取A对于的元素显示fprintf(' %8.4f',A(i,j));elseif i==j % 在对角线上, 则显示1fprintf(' %8d',1);else % 在上三角部分, 则显示0fprintf(' %8d',0);endendfprintf('\n'); % 换行enddisp('U=');for i=1:nfor j=1:nif i<=j % 在上三角部分或对角线上, 则取A对于的元素显示fprintf(' %8.4f',A(i,j));else % 在下三角部分, 则显示0fprintf(' %8d',0);endendfprintf('\n'); % 换行end《数值计算方法》实验3报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验3 解线性方程组的直接法(之LU 分解法) 2. 实验题目用LU 分解(Doolittle 分解)法求解线性方程组⎪⎩⎪⎨⎧=++=++=++104615631552162321321321x x x x x x x x x 3. 实验目的熟悉解线性方程组LU 分解法. 4. 基础理论若将矩阵A 进行了Doolittle 分解,A = LU ,则解方程组b x A=可以分解求解两个三角方程组b y L =和y x U=.它们都可直接代入求解,其中b y L =的代入公式为∑-==-=11,,2,1,k j j kj k k n k y l b y而y x U=的代入公式为∑+=-=-=nk j kk j kjk k n n k u x uy x 11,,1,,/)( .5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程(1)Doolittle 分解过程依次计算一行u 同时计算一列l 完成,并将计算的u ij (和l ij )仍存放在矩阵A 中的相应位置;(2)求解方程组的代入公式中用到的u ij 和l ij 都直接在A 的相应位置取值即可. 算法的伪代码描述:Input :阶数n ;矩阵A ;常数项向量b5 for k ← 1 to n6 ∑+=-=-=nkjkkjkjk knnkuxuyx11,,1,,/)( 回代求解Ux=y7 endfor8 return x1,…,x n7. 结果与分析8. 附录:程序清单%****************************************************% 程序名: LinearSystemByLU.m *% 程序功能: 利用LU分解(Doolittle分解)解方程组. *%****************************************************clc;clear all;n=3; % 矩阵阶数A=[1 2 6; 2 5 15; 6 15 46];b=[1;3;10];% LU分解(Doolittle分解)for k=1:n% 计算矩阵U的元素u_{kj}% (可参照下面l_{ik}的公式填写)% 计算矩阵L的元素l_{ik}% L在A下三角, U在上三角(对角线为1)endfor k=1:n % 用代入法求解下三角方程组Ly=by(k)=b(k);3%∑-==-=11,,2,1,k j j kjk k n k y lb y3 3enddisp('方程组Ly=b 的解:y='); disp(y');for k=n:-1:1 % 回代求解上三角方程组Ux=y x(k)=y(k);6%∑+=-=-=nk j j kjk k n n k x uy x 11,,1,,66 6enddisp('原方程组的解:x='); disp(x');《数值计算方法》实验3报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验3 解线性方程组的直接法(之Cholesky 分解) 2. 实验题目对矩阵A 进行Cholesky 分解,其中⎪⎪⎪⎪⎪⎭⎫⎝⎛----=3101141101421126A .3. 实验目的理解矩阵的Cholesky 分解. 4. 基础理论矩阵的Cholesky 分解是指将矩阵n n ij a A ⨯=)(可以分解为一个下三角矩阵L 和L 转置的乘积,即A =LL T ,其中L 各元素可依如下顺序公式计算⎪⎪⎩⎪⎪⎨⎧++=-=-=∑∑-=-=11112,,2,1,/)(k t kktk it ik ik k r kr kk kk nk k i l l l a l l a l其中k = 1,2,…,n .5. 实验环境操作系统:Windows xp ; 程序设计语言:VC++ 6. 实验过程(1)按计算公式依次先计算一列对角线上的元素l kk ,再计算这列其他元素l ik ,且对称位置的元素也取同一个值;(2)因为计算完l ij 后,a ij 就不再使用,为节省存储空间,将计算的l ij 仍存放在矩阵A 中的相应位置;(3)使用L 矩阵时需要根据元素所在位置取固定值或A 中相应位置的值.L 上三角部分为0,对角线和下三角部分为A 中对应的元素.算法的伪代码描述: Input :阶数n ;矩阵AOutput :矩阵L (合并存储在数组A 中)2∑-=-=112k r kr kk kk l a l3 for i ← k to n4 ∑-=-=11/)(k t kk tk it ik ik l l l a l计算结果存放在a ij 5 endfor 6 endfor 7return L输出L7. 结果与分析8. 附录:程序清单%************************************************************* %* 程 序 名:Cholesky.m * %* 程序功能:对称正定矩阵的Cholesky 分解. * %*************************************************************n=4; % 矩阵阶数 A=[6,2,1,-1; 2,4,1,0; 1,1,4,-1; -1,0,-1,3];disp('A ='); for i=1:n for j=1:nfprintf('%10.4f',A(i,j)); % 共占14位end fprintf('\n');% 一行结束换行end% Cholesky 分解for k=1:n% 计算对角线上的l _{kk}% 计算其他的l _{ik} % 和l _{ki}end % L在A下三角, L^T在上三角disp('分解结果:');disp('L=');for i=1:nfor j=1:nif i>=j % 在下三角部分或对角线上, 则取A对于的元素显示fprintf('%10.4f',A(i,j));else % 在上三角部分, 则显示0fprintf('%10d',0);endendfprintf('\n'); % 换行end《数值计算方法》实验3报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验3 解线性方程组的直接法(之改进的Cholesky 分解) 2. 实验题目对矩阵A 进行改进的Cholesky 分解,其中⎪⎪⎪⎪⎪⎭⎫⎝⎛----=3101141101421126A .3. 实验目的理解矩阵改进的Cholesky 分解. 4. 基础理论矩阵的改进的Cholesky 分解是指将矩阵n n ij a A ⨯=)(可以分解为一个单位下三角矩阵L 和对角矩阵D 及L 转置的乘积,即A =LDL T ,其中L 和D 各元素可依如下顺序公式计算⎪⎪⎩⎪⎪⎨⎧++=-=-=∑∑-=-=11112,,2,1,/)(k t k kt it t ik ik k r kr r kk k nk k i d l l d a l l d a d其中k = 1,2,…,n .5. 实验环境操作系统:Windows xp ; 程序设计语言:VC++ 6. 实验过程(1)按计算公式依次先计算D 的一个元素d k ,再计算L 中这列的元素l ik ,且对称位置的元素也取同一个值;(2)因为计算完d k 和l ij 后,a kk 或a ij 就不再使用,为节省存储空间,将计算的a kk 或l ij仍存放在矩阵A 中的相应位置;(3)使用L 矩阵时需要根据元素所在位置取固定值或A 中相应位置的值.L 对角线和上三角部分为0,下三角部分为A 中对应的元素;D 对角线为A 中对应的元素,其余都是0.算法的伪代码描述: Input :阶数n ;矩阵AOutput :矩阵L (合并存储在数组A 中)2 ∑-=-=112k r kr r kk k l d a d3 for i ← k to n4 ∑-=-=11/)(k t k kt it t ik ik d l l d a l计算结果存放在a ij 5 endfor 6 endfor7return L, D输出L 和D7. 结果与分析8. 附录:程序清单%************************************************************* %* 程 序 名:ImprovedCholesky.m * %* 程序功能:对称正定矩阵的改进的Cholesky 分解. * %*************************************************************n=4; % 矩阵阶数 A=[6,2,1,-1; 2,4,1,0; 1,1,4,-1; -1,0,-1,3];disp('A ='); for i=1:n for j=1:nfprintf('%10.4f',A(i,j)); % 共占14位end fprintf('\n');% 一行结束换行end% Cholesky 分解 for k=1:n% 计算D 对角线上的u _{kk}% 计算L 的元素l _{ik} % 和L 转置的元素l _{ki}end % L在A下三角, D在对角线disp('分解结果:');disp('L=');for i=1:nfor j=1:nif i>j % 在下三角部分, 则取A对于的元素显示fprintf('%10.4f',A(i,j));elseif i==j % 在对角线上, 则显示1fprintf('%10d',1);else % 在上三角部分, 则显示0fprintf('%10d',0);endendfprintf('\n'); % 换行enddisp('D=');for i=1:nfor j=1:nif i==j % 在对角线上, 则取A对于的元素显示fprintf('%10.4f',A(i,j));else % 其余显示0fprintf('%10d',0);endendfprintf('\n'); % 换行end《数值计算方法》实验3报告班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验3 解线性方程组的直接法(之追赶法) 2. 实验题目用追赶法求解线性方程组⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛-----101053001210023100124321x x x x 3. 实验目的熟悉解线性方程组的追赶法. 4. 基础理论对于系数矩阵为三对角矩阵的方程组,其Crout 分解可分解为⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=------11111211122111122211n n nn n n n n n n t t t s a s a s a s b a c b a c b a c b A这样,解方程组可以由如下2步完成:“追”:,,,3,2,/)(,,/,/,1111111111n i s y a f y t a b s s c t s f y b s i i i i i i i i i i i i =-=-====-----其中:Tn f f ),,(1 为方程组的常数项,n t 没用;“赶”:.1,,2,1,,1 --=-==+n n i x t y x y x i i i i n n5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程在“追”的过程中,向量s 和y 都有n 个元素,t 只有n -1个元素,又1s 和1y 的计算公式与其它i s 和i y 不同,所以先单独计算1s 和1y ,然后在一个n -1次循环中,求其它i s 和i y 以及i t .由于在“追”的过程中,i b ,i c 和i f 在分别计算完对应的i s ,i t 和i y 后就不再使用,所以借用数组b ,c 和f 存储向量s ,t 和y ;同样在“赶”的过程中,i y 在计算完对应的i x 后就不再使用,所以再一次借用数组f 存储向量x .追赶法算法的伪代码描述:Input :阶数n ;三对角矩阵的三条对角线向量a ,b ,c ,常数项向量f Output :方程组的解x改进的追赶法算法的伪代码描述:Input :阶数n ;三对角矩阵的三条对角线向量a ,b ,c ,常数项向量f Output :方程组的解x7. 结果与分析8. 附录:程序清单%*************************************************************%* 程序名:ChaseAfter.m *%* 程序功能:用追赶法求解三对角线性方程组. *%*************************************************************clc;clear all;n=4;a=[0,-1,-1,-3];b=[2, 3, 2, 5];c=[-1, -2, -1, 0];f=[0, 1, 0, 1];% "追"s(1) = b(1);y(1) = f(1); % 先单独求s_1和y_1for k = 1 : n-1% 再求t_i(i=1,2,…,n-1)% s_i(i=2,3,…,n)% y_i(i=2,3,…,n)end% "赶"x(n) = y(n); % 先单独求x_nfor k = n-1 : -1 : 1% 再求x_i(i=n-1,n-2, (1)endx=x' % 输出解向量------------------------------------------------------------------------------------------------------------------- 改进的程序:%*************************************************************%* 程序名:ChaseAfter.m *%* 程序功能:用追赶法求解三对角线性方程组. *%*************************************************************clc;clear all;n=4;a=[0,-1,-1,-3];b=[2, 3, 2, 5];c=[-1, -2, -1, 0];f=[0, 1, 0, 1];% "追"% b(1)=b(1); % s_1仍在b_1中,不用重新计算y(1)=f(1)/b(1); % 先单独y_1for k=1:n-1% 再求t_i(i=1,2,…,n-1)% s_i(i=2,3,…,n)% y_i(i=2,3,…,n)end% "赶"% f(n)=f(n); % x_n等于y_n仍在f_n中for k=n-1:-1:1% 再求x_i(i=n-1,n-2, (1)endx=f' % 输出解向量班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验4 解线性方程组的迭代法(之Jacobi 迭代) 2. 实验题目用Jacobi 迭代法求解线性方程组1231231232251223x x x x x x x x x +-=⎧⎪++=⎪⎨++=⎪⎪⎩任取3. 实验目的掌握解线性方程组的Jacobi 迭代法. 4. 基础理论将第i (n i ≤≤1)个方程i n in i i b x a x a x a =+++ 2211移项后得到等价方程ii n in i i i i i i i i i a x a x a x a x a b x /)(11,11,11------=++--便可构造出Jacobi 迭代公式,1,0,/)()()(11,)(11,)(11)1(=------=++--+k a x a x a x a x a b x ii k n in k i i i k i i i k i i k i . 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程7. 结果与分析8. 附录:程序清单班级: 20xx 级XXXXx 班 学号: 20xx2409xxxx 姓名: XXX 成绩:1. 实验名称实验4 解线性方程组的迭代法(之Gauss-Seidel 迭代) 2. 实验题目用Gauss-Seidel 迭代法求解线性方程组⎪⎪⎩⎪⎪⎨⎧=+-=-+-=+-+-=+-15831110225311621043243214321321x x x x x x x x x x x x x x3. 实验目的掌握解线性方程组的Gauss-Seidel 迭代法. 4. 基础理论将第i (n i ≤≤1)个方程i n in i i b x a x a x a =+++ 2211移项后得到等价方程ii n in i i i i i i i i i a x a x a x a x a b x /)(11,11,11------=++--便可构造出Jacobi 迭代公式,1,0,/)()()(11,)(11,)(11)1(=-----=++--+k a x a x x a x a b x ii k n in k i i i k i i i k i i k i 和Gauss-Seidel 迭代公式,1,0,/)()()(11,)1(11,)1(11)1(=-----=+++--++k a x a x a x x a b x ii k n in k i i i k i i i k i i k i . 5. 实验环境操作系统:Windows xp ; 程序设计语言:Matlab 6. 实验过程7. 结果与分析8. 附录:程序清单。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中国地质大学(武汉)数值分析报告
学生姓名:张天馨
所在学院:地球物理与空间信息学院学生班级:061125
学生学号:20121002820
任课教师:付丽华
一、目的
1.熟悉Matlab的基本操作过程
2.掌握在数学领域的相关应用
二、内容
求解秦九韶算法的计算复杂度MATLAB程序设计:
>>tic;
p=input('please input p(x)='); x=input('please input x=');
n=length(p);
s(1)=p(1);
for i=1:n-1
s(i+1)=s(i)*x+p(i+1);
end
p=s(n)
toc;
程序运行结果:
三、实习总结与心得
秦九韶的算法很简单,因此在写这个程序时也并不感到十分困难。
通过这个作业我也更深刻的体会到了用计算机来解决数学问题的便携。
希望能在未来的数值分析学习中充分结合程序技能、融会贯通,用高科技去探索数学世界的奥秘。