计算机语言运用–数值计算9-方程的计算机处理91-4_Matlab
计算机:电子线路组成的计算机器。人与计算机则是通过计算机语言-符号系统说给计算机听而交流。
计算机语言有低级语言-机器语言、汇编、高级语言-C/C++/C#/VB/PASCAL/LISP/JAVA/PYTHON/……成百上千种之多。
作为一种计算机器—可以协助人类处理各种事情—数值计算问题、文字处理问题、图形图像处理问题、事务问题……。自从有了数字计算的计算机器,几乎所有的可以交给计算机的事情,都交给计算机来处理—是辅助处理—按照人们的要求—事先安排的模式进行处理。
数值计算
方程的计算机处理
这里说的方程,是以实数域为计算范围。
这里说的方程:是含有未知数的等式。
可以是a+5=8,或X+A=B,或ax2+bx+c=0,或ax+by=c与dx-ey=f,或ax"+bx=c,或,或
……、……
计算机如何处理这些问题呢?,问题的描述是什么样子的,才能充分利用计算机呢?
当然是代数形式的。便于计算机发挥特长,便于程序软件的重用性。通过用户交互,决定将什么样的具体问题交给计算机进行数值处理。
方程的计算机处理:
MATLAB语言及其平台
从最简单的起步,再逐级复杂,以便体会程序编写、方程的手工预处理及其人机交互。
可以用脚本文件—解释型、动态数据类型的计算机语言连续自动运行模式
a=input(‘输入第一个数 ‘)
b=input(‘输入第二个数 ‘)
x=b-a;
disp(‘输出计算结果 x=b-a=’),x
disp(‘输出计算结果 x=b+a=’),b+a
disp(‘输出计算结果x=b*a=’),b*a
disp(‘输出计算结果x=b/a=’),b/a
感觉咋样?什么是方程的计算机处理—算法及其描述,运行及其人机交互。
从最简单的代数方程计算机处理开始,通过计算机语言的运行了解、理解程序编写需要的格式。算法描述的计算机处理模式–将方程进行必要的改变,适合计算机语言描述,适合计算机按照数字电路的逻辑模式进行处理。
X+a=b型的方程需要进行改造,成为—-X=b-a的样式;
计算机是进行数值计算的好帮手,因此需要对a,b预先赋值,再进行计算;
那么对于一元三次方程呢?也是如此。当然,最好是用求解方程的三个根的公式来进行处理—也就是,用它们作为计算机语言描述的基础。当然,需要计算机语言描述判别开平方中的虚数—复数根的问题。这样,便有了方程处理的前期工作,手工处理。
%一元三次方程–Cubicequation
a=input(‘输入方程各项次系数 =[3 2 10] roots = ‘)
p=(3*a(1)*a(3)-a(2).^2)/(3*a(1).^2);
q=(27*a(4)*a(1).^2-9*a(1)*a(2)*a(3)+2*a(2).^3)/(27*a(1).^3);
dlt=(q/2).^2+(p/3).^3
omig=-0.5+0.866i;
omig2=-0.5-0.866i;
if(dlt>0)
x1=(-q/2+sqrt(dlt)).^(1/3)+(-q/2-sqrt(dlt)).^(1/3);
x2=omig*((-q/2+sqrt(dlt)).^(1/3))+omig2*((-q/2-sqrt(dlt)).^(1/3));
x3=omig2*((-q/2+sqrt(dlt)).^(1/3))+omig*((-q/2-sqrt(dlt)).^(1/3));
y1=x1-a(2)/(3*a(1));
y2=x2-a(2)/(3*a(1));
y3=x3-a(2)/(3*a(1));
disp(‘方程有一个实数根,一对共轭复根’ )
fprintf(‘ 求得一个实数根 ‘),y1
fprintf(‘ 解出一个复根 ‘),y2
fprintf(‘ 解出一个复根 ‘),y3
else if(dlt==0)
x1=(-q/2).^(1/3)+(-q/2).^(1/3);
x2=omig*((-q/2).^(1/3))+omig2*((-q/2)^(1/3));
x3=omig2*((-q/2).^(1/3))+omig*((-q/2).^(1/3));
qq=x1*x2*x3;
y1=x1-a(2)/(3*a(1));
y2=x2-a(2)/(3*a(1));
y3=x3-a(2)/(3*a(1));
disp(‘方程有三个实数根,其中两个相等’ )
fprintf(‘ 求得一个根 ‘),y1
fprintf(‘ 解出一个根 ‘),y2
fprintf(‘ 解出一个根 ‘),y3
else
x1=(-q/2+sqrt(dlt)).^(1/3)+(-q/2-sqrt(dlt)).^(1/3);
x2=omig*((-q/2+sqrt(dlt)).^(1/3))+omig2*((-q/2-sqrt(dlt)).^(1/3));
x3=omig2*((-q/2+sqrt(dlt)).^(1/3))+omig*((-q/2-sqrt(dlt)).^(1/3));
qq=x1*x2*x3;
y1=x1-a(2)/(3*a(1));
y2=x2-a(2)/(3*a(1));
y3=x3-a(2)/(3*a(1));
disp(‘方程有三个实数根’ )
fprintf(‘ 求得一个根 ‘),y1
fprintf(‘ 解出一个根 ‘),y2
fprintf(‘ 解出一个根 ‘),y3
end
end
检测一下:(x-1)*(x-1)*(x-1)–……
看看运行结果
你可能说,这太笨了!人家有现成的函数。是的。
>> ans=roots([1 -3 3 -1])
ans =
1.0000
1.0000 + 0.0000i
1.0000 – 0.0000i
>>
再验证几个,多多测试,发现问题。给一个已知三个解的方程;(x-1)*(x-2)*(x-3)的系数,检查程序运行结果。
输入方程各项次系数 =[3 2 10] roots = [1 -6 11 -6]
a = 1 -6 11 -6
dlt = -0.0370
方程有三个实数根
求得一个根 y1 = 3
解出一个根 y2 = 1.0000
解出一个根 y3 = 2.0000
>>
用MATLAB的求解函数验证:
输入方程各项次系数 =[3 2 1 0] roots = [1 6 11-6]
a = 1 6 11 -6
dlt = 35.9630
方程有一个实数根,一对共轭复根
求得一个实数根
y1 = 0.4348
解出一个复根
y2 = -3.2174 + 1.8564i
解出一个复根
y3 = -3.2174 – 1.8564i
>> ans=roots([1 6 11 -6])
ans =
-3.2174 + 1.8564i
-3.2174 – 1.8564i
0.4348
输入方程各项次系数 =[3 2 10] roots = [1 7 13 4]
a = 1 7 13 4
dlt = -1.1574
方程有三个实数根
求得一个根
y1 = -0.3820
解出一个根
y2 = -4.0000
解出一个根
y3 = -2.6181
>> ans=roots([1 7 13 4])
ans =
-4.0000
-2.6180
-0.3820
输入方程各项次系数 =[3 2 10] roots = [1 7 -13 4]
a = 1 7 -13 4
dlt = -42.5648
方程有三个实数根
求得一个根
y1 = 1.1735
解出一个根
y2 = -8.5710
解出一个根
y3 = 0.3976
>>
>> ans=roots([1 7 -13 4])
ans =
-8.5712
1.1735
0.3977
这就是MATLAB的优势。它将常用的数学问题求解,都做成了库函数,用户简单调用即可。
咱不是要说明实际数学问题怎么变成计算机处理吗!就是数学方程的预先处理问题、计算机语言描述问题嘛。
上述结果证明,咱编写的程序是对的。MATLAB提供的开方函数sqrt()是可以自动解决负数开平方问题—也就是虚数问题。否则,咱还要再多写几行程序,判别虚根。
在C、C++、C#、Fortran等语言中,你就能看到这个问题的处理与描述。