王明菱 付云偉 王麗明
摘要:程序設(shè)計(jì)為解決數(shù)學(xué)問題提供了可行的思路和方法。借助程序可以快速解決不可積的積分問題、快速求冪問題、矩陣乘法問題、歐幾里德問題等數(shù)學(xué)問題,從應(yīng)用實(shí)例中領(lǐng)悟了程序設(shè)計(jì)在解決數(shù)學(xué)問題上的優(yōu)越性和便利性。
關(guān)鍵詞:程序設(shè)計(jì);數(shù)學(xué);積分;快速冪;矩陣;歐幾里德
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)07-0078-04
程序設(shè)計(jì)與數(shù)學(xué)之間有著天然的聯(lián)系,兩者相輔相成。數(shù)學(xué)是程序設(shè)計(jì)的基礎(chǔ),程序設(shè)計(jì)基于數(shù)學(xué)建模,又成為解決數(shù)學(xué)問題的一種重要途徑。實(shí)踐中,借助程序快速求解了不可積的積分問題、快速求冪問題、矩陣乘法問題、歐幾里德問題,用實(shí)例證明并展示了程序設(shè)計(jì)應(yīng)用于解決數(shù)學(xué)問題的獨(dú)特優(yōu)勢(shì)和便捷高效。
1 不可積的積分問題
在實(shí)際數(shù)學(xué)運(yùn)算中,經(jīng)常要用到各種積分。能夠直接積出來的積分已經(jīng)不是難題,但一旦遇到不可積的積分,人們往往束手無(wú)策。作者借助程序?qū)⒉豢煞e的積分進(jìn)行了求解。對(duì)不可積的積分問題的近似解,提出了兩種方法,一種是根據(jù)積分的性質(zhì)以及求積分的基本思想,利用分割取近似的方法,將積分的近似值求出來。另一種是使用Romberg算法,將被積函數(shù)展開,并使用梯形法遞推公式,以求出積分的值。
1.1分割取近似法(詳見附錄1:“求積分(近似).cpp”)
分割取近似法是在求定積分的過程中常用的方法。具體方法是,設(shè)被積函數(shù)為f(x),將積分區(qū)間平均分成n等份,每份的寬度為h,則:
實(shí)踐中,可以用類似于上述實(shí)例的求解方法,在求gcd(m,n)的過程中,通過逆推將線性組合表示出來。
擴(kuò)展歐幾里德算法實(shí)現(xiàn):詳見附錄6:“歐幾里德.cpp”。
5 結(jié)束語(yǔ)
借助程序快速求解不可積的積分問題、快速求冪問題、矩陣乘法問題、歐幾里德問題等實(shí)例,從新的視角展示了程序設(shè)計(jì)在解決數(shù)學(xué)問題上的應(yīng)用優(yōu)越性。利用分割取近似的方法求解積分的近似值,使用Romberg算法展開被積函數(shù),并運(yùn)用梯形法遞推公式求出積分的值,結(jié)合滿二叉樹定律及遞歸思想,將O(n)求冪的算法優(yōu)化至[O(log2n)],使用矩陣乘法+快速冪的思想解決斐波那契數(shù)列問題等等,為人們?cè)诳焖偾蠼馄渌麛?shù)學(xué)問題時(shí)提供了新的思路。今后,隨著程序設(shè)計(jì)應(yīng)用的不斷深入,必將使更多更復(fù)雜的數(shù)學(xué)問題迎刃而解。
參考文獻(xiàn):
[1]陳宇.數(shù)論及應(yīng)用[M].哈爾濱:哈爾濱工業(yè)大學(xué)出版社,2012.
[2]俞勇.ACM國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽:算法與實(shí)現(xiàn)[M].北京:清華大學(xué)出版社,2013.
[3]趙一煊.淺析數(shù)學(xué)與程序設(shè)計(jì)的關(guān)系[J].通訊世界,2015(23):296-297.
[4]劉方明.程序設(shè)計(jì)中的數(shù)學(xué)方法[J].電腦知識(shí)與技術(shù),2012,8(25):6022-6024.
附錄:
1.求積分(近似).cpp
#include
#include
#include
#include
#include
#include
#define MIN_LIMIT 1e-5
#define e 2.71828182
#define pie 3.1415926
#define INF 100000
using namespace std;
int N;
double H,A,B,V,ak[10],bk[10],hk[10];
inline double f(double x)
{
return pie*(A*A*pow(e,-2.0*x*x)+B*B*x+2*A*B*pow(e,-x*x)*pow(x,0.5));
}
template
double simpson(const T &f;,double a,double b,int n)
{
const double h=(b-a)/n;
double ans=f(a)+f(b);
for(int i=1;i ans+=4*f(a+i*h); for(int i=2;i ans+=2*f(a+i*h); return ans*h/3; } int main() { double a,b; while(cin>>a>>b>>A>>B) { cout< } return 0; } 2. 求積分(精確).cpp 3. 快速冪.cpp #include #include #include #include using namespace std; int a,n; int ksm(int a,int n) { if(n<=1)
return a;
int ans=ksm(a,n/2);
ans*=ans;
if(n&1)
ans*=a;
return ans;
}
int main()
{
while(scanf("%d%d",&a;,&n;)!=EOF)
{
printf("%d\n",ksm(a,n));
}
return 0;
}
4. 矩陣乘法.cpp
5. 經(jīng)典歐幾里德.cpp
#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll gcd(ll m,ll n)
{
if(!n)
return m;
return gcd(n,m%n);
}
int main()
{
ll m,n;
while(cin>>m>>n)
{
cout< } return 0; } 6. 擴(kuò)展歐幾里德.cpp #include #include #include #include using namespace std; typedef long long ll; ll exgcd(ll m,ll &x;,ll n,ll &y;) { ll x1,y1,x0,y0; x0=1;y0=0; x1=0;y1=1; ll r=(m%n+n)%n; ll q=(m-r)/n; x=0;y=1; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1;y0=y1; x1=x;y1=y; m=n;n=r;r=m%n; q=(m-r)/n; } return n; } int main() { ll m,n; while(cin>>m>>n) { ll x,y; ll ans=exgcd(m,x,n,y); cout< } return 0; }