计算机语言运用–数值计算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预先赋值,再进行计算;

那么对于一元三次方程呢?也是如此。当然,最好是用求解方程的三个根的公式来进行处理—也就是,用它们作为计算机语言描述的基础。当然,需要计算机语言描述判别开平方中的虚数—复数根的问题。这样,便有了方程处理的前期工作,手工处理。

b0ed79045c79d84314fdf5c51cf354dc.png 

%一元三次方程–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)–……

看看运行结果

62fb4c35244a4a978b0ae5489b6a843d.png

你可能说,这太笨了!人家有现成的函数。是的。

>> 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等语言中,你就能看到这个问题的处理与描述。