求c語言矩陣位移法的程序,矩陣位移法編程

本文目錄一覽:

急求能夠計算矩陣位移法的C語言或者fortran的源代碼,急急急,有的請發275614232@qq.com

《計算結構力學》朱慈勉,吳宇清編,上面有fortran和C++關於矩陣位移法的源程序

矩陣位移法的解題步驟有哪些?2,位移邊界條件是如何處理的

有多餘約束( n ; 無多餘約束( n = 0)的幾何不變體系——靜定結構從幾何構造分析的角度看; 0)的幾何不變體系——超靜定結構:凡只,結構必須是幾何不變體系。

根據多餘約束 n 。 從求解內力和反力的方法也可以認為: 靜定結構,幾何不變體系又分為

如何用C語言編寫求對稱矩陣的特徵值和特徵向量的程序

//數值計算程序-特徵值和特徵向量

//////////////////////////////////////////////////////////////

//約化對稱矩陣為三對角對稱矩陣

//利用Householder變換將n階實對稱矩陣約化為對稱三對角矩陣

//a-長度為n*n的數組,存放n階實對稱矩陣

//n-矩陣的階數

//q-長度為n*n的數組,返回時存放Householder變換矩陣

//b-長度為n的數組,返回時存放三對角陣的主對角線元素

//c-長度為n的數組,返回時前n-1個元素存放次對角線元素

void eastrq(double a[],int n,double q[],double b[],double c[]);

//////////////////////////////////////////////////////////////

//求實對稱三對角對稱矩陣的全部特徵值及特徵向量

//利用變型QR方法計算實對稱三對角矩陣全部特徵值及特徵向量

//n-矩陣的階數

//b-長度為n的數組,返回時存放三對角陣的主對角線元素

//c-長度為n的數組,返回時前n-1個元素存放次對角線元素

//q-長度為n*n的數組,若存放單位矩陣,則返回實對稱三對角矩陣的特徵向量組

// 若存放Householder變換矩陣,則返回實對稱矩陣A的特徵向量組

//a-長度為n*n的數組,存放n階實對稱矩陣

int ebstq(int n,double b[],double c[],double q[],double eps,int l);

//////////////////////////////////////////////////////////////

//約化實矩陣為赫申伯格(Hessen berg)矩陣

//利用初等相似變換將n階實矩陣約化為上H矩陣

//a-長度為n*n的數組,存放n階實矩陣,返回時存放上H矩陣

//n-矩陣的階數

void echbg(double a[],int n);

//////////////////////////////////////////////////////////////

//求赫申伯格(Hessen berg)矩陣的全部特徵值

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//利用帶原點位移的雙重步QR方法求上H矩陣的全部特徵值

//a-長度為n*n的數組,存放上H矩陣

//n-矩陣的階數

//u-長度為n的數組,返回n個特徵值的實部

//v-長度為n的數組,返回n個特徵值的虛部

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int edqr(double a[],int n,double u[],double v[],double eps,int jt);

//////////////////////////////////////////////////////////////

//求實對稱矩陣的特徵值及特徵向量的雅格比法

//利用雅格比(Jacobi)方法求實對稱矩陣的全部特徵值及特徵向量

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的數組,存放實對稱矩陣,返回時對角線存放n個特徵值

//n-矩陣的階數

//u-長度為n*n的數組,返回特徵向量(按列存儲)

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int eejcb(double a[],int n,double v[],double eps,int jt);

//////////////////////////////////////////////////////////////

選自徐世良數值計算程序集(C)

每個程序都加上了適當地注釋,陸陸續續幹了幾個月才整理出來的啊。

今天都給貼出來了

#include “stdio.h”

#include “math.h”

//約化對稱矩陣為三對角對稱矩陣

//利用Householder變換將n階實對稱矩陣約化為對稱三對角矩陣

//a-長度為n*n的數組,存放n階實對稱矩陣

//n-矩陣的階數

//q-長度為n*n的數組,返回時存放Householder變換矩陣

//b-長度為n的數組,返回時存放三對角陣的主對角線元素

//c-長度為n的數組,返回時前n-1個元素存放次對角線元素

void eastrq(double a[],int n,double q[],double b[],double c[])

{

int i,j,k,u,v;

double h,f,g,h2;

for (i=0; i=n-1; i++)

{

for (j=0; j=n-1; j++)

{

u=i*n+j; q[u]=a[u];

}

}

for (i=n-1; i=1; i–)

{

h=0.0;

if (i1)

{

for (k=0; k=i-1; k++)

{

u=i*n+k;

h=h+q[u]*q[u];

}

}

if (h+1.0==1.0)

{

c[i-1]=0.0;

if (i==1)

{

c[i-1]=q[i*n+i-1];

}

b[i]=0.0;

}

else

{

c[i-1]=sqrt(h);

u=i*n+i-1;

if (q[u]0.0)

{

c[i-1]=-c[i-1];

}

h=h-q[u]*c[i-1];

q[u]=q[u]-c[i-1];

f=0.0;

for (j=0; j=i-1; j++)

{

q[j*n+i]=q[i*n+j]/h;

g=0.0;

for (k=0; k=j; k++)

{

g=g+q[j*n+k]*q[i*n+k];

}

if (j+1=i-1)

{

for (k=j+1; k=i-1; k++)

{

g=g+q[k*n+j]*q[i*n+k];

}

}

c[j-1]=g/h;

f=f+g*q[j*n+i];

}

h2=f/(h+h);

for (j=0; j=i-1; j++)

{

f=q[i*n+j];

g=c[j-1]-h2*f;

c[j-1]=g;

for (k=0; k=j; k++)

{

u=j*n+k;

q[u]=q[u]-f*c[k-1]-g*q[i*n+k];

}

}

b[i]=h;

}

}

b[0]=0.0;

for (i=0; i=n-1; i++)

{

if ((b[i]!=0.0)(i-1=0))

{

for (j=0; j=i-1; j++)

{

g=0.0;

for (k=0; k=i-1; k++)

{

g=g+q[i*n+k]*q[k*n+j];

}

for (k=0; k=i-1; k++)

{

u=k*n+j;

q[u]=q[u]-g*q[k*n+i];

}

}

}

u=i*n+i;

b[i]=q[u];

q[u]=1.0;

if (i-1=0)

{

for (j=0; j=i-1; j++)

{

q[i*n+j]=0.0;

q[j*n+i]=0.0;

}

}

}

return;

//求實對稱三對角對稱矩陣的全部特徵值及特徵向量

//利用變型QR方法計算實對稱三對角矩陣全部特徵值及特徵向量

//n-矩陣的階數

//b-長度為n的數組,返回時存放三對角陣的主對角線元素

//c-長度為n的數組,返回時前n-1個元素存放次對角線元素

//q-長度為n*n的數組,若存放單位矩陣,則返回實對稱三對角矩陣的特徵向量組

// 若存放Householder變換矩陣,則返回實對稱矩陣A的特徵向量組

//a-長度為n*n的數組,存放n階實對稱矩陣

int ebstq(int n,double b[],double c[],double q[],double eps,int l)

{

int i,j,k,m,it,u,v;

double d,f,h,g,p,r,e,s;

c[n-1]=0.0;

d=0.0;

f=0.0;

for (j=0; j=n-1; j++)

{

it=0;

h=eps*(fabs(b[j])+fabs(c[j]));

if (hd)

{

d=h;

}

m=j;

while ((m=n-1)(fabs(c[m])d))

{

m=m+1;

}

if (m!=j)

{

do

{

if (it==l)

{

printf(“fail\n”);

return(-1);

}

it=it+1;

g=b[j];

p=(b[j+1]-g)/(2.0*c[j]);

r=sqrt(p*p+1.0);

if (p=0.0)

{

b[j]=c[j]/(p+r);

}

else

{

b[j]=c[j]/(p-r);

}

h=g-b[j];

for (i=j+1; i=n-1; i++)

{

b[i]=b[i]-h;

}

f=f+h;

p=b[m];

e=1.0;

s=0.0;

for (i=m-1; i=j; i–)

{

g=e*c[i];

h=e*p;

if (fabs(p)=fabs(c[i]))

{

e=c[i]/p;

r=sqrt(e*e+1.0);

c[i+1]=s*p*r;

s=e/r;

e=1.0/r;

}

else

{

e=p/c[i];

r=sqrt(e*e+1.0);

c[i+1]=s*c[i]*r;

s=1.0/r;

e=e/r;

}

p=e*b[i]-s*g;

b[i+1]=h+s*(e*g+s*b[i]);

for (k=0; k=n-1; k++)

{

u=k*n+i+1;

v=u-1;

h=q[u];

q[u]=s*q[v]+e*h;

q[v]=e*q[v]-s*h;

}

}

c[j]=s*p;

b[j]=e*p;

}

while (fabs(c[j])d);

}

b[j]=b[j]+f;

}

for (i=0; i=n-1; i++)

{

k=i; p=b[i];

if (i+1=n-1)

{

j=i+1;

while ((j=n-1)(b[j]=p))

{

k=j;

p=b[j];

j=j+1;

}

}

if (k!=i)

{

b[k]=b[i];

b[i]=p;

for (j=0; j=n-1; j++)

{

u=j*n+i;

v=j*n+k;

p=q[u];

q[u]=q[v];

q[v]=p;

}

}

}

return(1);

}

//約化實矩陣為赫申伯格(Hessen berg)矩陣

//利用初等相似變換將n階實矩陣約化為上H矩陣

//a-長度為n*n的數組,存放n階實矩陣,返回時存放上H矩陣

//n-矩陣的階數

void echbg(double a[],int n)

{ int i,j,k,u,v;

double d,t;

for (k=1; k=n-2; k++)

{

d=0.0;

for (j=k; j=n-1; j++)

{

u=j*n+k-1;

t=a[u];

if (fabs(t)fabs(d))

{

d=t;

i=j;

}

}

if (fabs(d)+1.0!=1.0)

{

if (i!=k)

{

for (j=k-1; j=n-1; j++)

{

u=i*n+j;

v=k*n+j;

t=a[u];

a[u]=a[v];

a[v]=t;

}

for (j=0; j=n-1; j++)

{

u=j*n+i;

v=j*n+k;

t=a[u];

a[u]=a[v];

a[v]=t;

}

}

for (i=k+1; i=n-1; i++)

{

u=i*n+k-1;

t=a[u]/d;

a[u]=0.0;

for (j=k; j=n-1; j++)

{

v=i*n+j;

a[v]=a[v]-t*a[k*n+j];

}

for (j=0; j=n-1; j++)

{

v=j*n+k;

a[v]=a[v]+t*a[j*n+i];

}

}

}

}

return;

}

//求赫申伯格(Hessen berg)矩陣的全部特徵值

//利用帶原點位移的雙重步QR方法求上H矩陣的全部特徵值

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的數組,存放上H矩陣

//n-矩陣的階數

//u-長度為n的數組,返回n個特徵值的實部

//v-長度為n的數組,返回n個特徵值的虛部

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int edqr(double a[],int n,double u[],double v[],double eps,int jt)

{

int m,it,i,j,k,l,ii,jj,kk,ll;

double b,c,w,g,xy,p,q,r,x,s,e,f,z,y;

it=0;

m=n;

while (m!=0)

{

l=m-1;

while ((l0)(fabs(a[l*n+l-1])eps*(fabs(a[(l-1)*n+l-1])+fabs(a[l*n+l]))))

{

l=l-1;

}

ii=(m-1)*n+m-1;

jj=(m-1)*n+m-2;

kk=(m-2)*n+m-1;

ll=(m-2)*n+m-2;

if (l==m-1)

{

u[m-1]=a[(m-1)*n+m-1];

v[m-1]=0.0;

m=m-1; it=0;

}

else if (l==m-2)

{

b=-(a[ii]+a[ll]);

c=a[ii]*a[ll]-a[jj]*a[kk];

w=b*b-4.0*c;

y=sqrt(fabs(w));

if (w0.0)

{

xy=1.0;

if (b0.0)

{

xy=-1.0;

}

u[m-1]=(-b-xy*y)/2.0;

u[m-2]=c/u[m-1];

v[m-1]=0.0; v[m-2]=0.0;

}

else

{

u[m-1]=-b/2.0;

u[m-2]=u[m-1];

v[m-1]=y/2.0;

v[m-2]=-v[m-1];

}

m=m-2;

it=0;

}

else

{

if (it=jt)

{

printf(“fail\n”);

return(-1);

}

it=it+1;

for (j=l+2; j=m-1; j++)

{

a[j*n+j-2]=0.0;

}

for (j=l+3; j=m-1; j++)

{

a[j*n+j-3]=0.0;

}

for (k=l; k=m-2; k++)

{

if (k!=l)

{

p=a[k*n+k-1];

q=a[(k+1)*n+k-1];

r=0.0;

if (k!=m-2)

{

r=a[(k+2)*n+k-1];

}

}

else

{

x=a[ii]+a[ll];

y=a[ll]*a[ii]-a[kk]*a[jj];

ii=l*n+l;

jj=l*n+l+1;

kk=(l+1)*n+l;

ll=(l+1)*n+l+1;

p=a[ii]*(a[ii]-x)+a[jj]*a[kk]+y;

q=a[kk]*(a[ii]+a[ll]-x);

r=a[kk]*a[(l+2)*n+l+1];

}

if ((fabs(p)+fabs(q)+fabs(r))!=0.0)

{

xy=1.0;

if (p0.0)

{

xy=-1.0;

}

s=xy*sqrt(p*p+q*q+r*r);

if (k!=l)

{

a[k*n+k-1]=-s;

}

e=-q/s;

f=-r/s;

x=-p/s;

y=-x-f*r/(p+s);

g=e*r/(p+s);

z=-x-e*q/(p+s);

for (j=k; j=m-1; j++)

{

ii=k*n+j;

jj=(k+1)*n+j;

p=x*a[ii]+e*a[jj];

q=e*a[ii]+y*a[jj];

r=f*a[ii]+g*a[jj];

if (k!=m-2)

{

kk=(k+2)*n+j;

p=p+f*a[kk];

q=q+g*a[kk];

r=r+z*a[kk];

a[kk]=r;

}

a[jj]=q;

a[ii]=p;

}

j=k+3;

if (j=m-1)

{

j=m-1;

}

for (i=l; i=j; i++)

{

ii=i*n+k;

jj=i*n+k+1;

p=x*a[ii]+e*a[jj];

q=e*a[ii]+y*a[jj];

r=f*a[ii]+g*a[jj];

if (k!=m-2)

{

kk=i*n+k+2;

p=p+f*a[kk];

q=q+g*a[kk];

r=r+z*a[kk];

a[kk]=r;

}

a[jj]=q;

a[ii]=p;

}

}

}

}

}

return(1);

}

//求實對稱矩陣的特徵值及特徵向量的雅格比法

//利用雅格比(Jacobi)方法求實對稱矩陣的全部特徵值及特徵向量

//返回值小於0表示超過迭代jt次仍未達到精度要求

//返回值大於0表示正常返回

//a-長度為n*n的數組,存放實對稱矩陣,返回時對角線存放n個特徵值

//n-矩陣的階數

//u-長度為n*n的數組,返回特徵向量(按列存儲)

//eps-控制精度要求

//jt-整型變數,控制最大迭代次數

int eejcb(double a[],int n,double v[],double eps,int jt)

{

int i,j,p,q,u,w,t,s,l;

double fm,cn,sn,omega,x,y,d;

l=1;

for (i=0; i=n-1; i++)

{

v[i*n+i]=1.0;

for (j=0; j=n-1; j++)

{

if (i!=j)

{

v[i*n+j]=0.0;

}

}

}

while (1==1)

{

fm=0.0;

for (i=0; i=n-1; i++)

{

for (j=0; j=n-1; j++)

{

d=fabs(a[i*n+j]);

if ((i!=j)(dfm))

{

fm=d;

p=i;

q=j;

}

}

}

if (fmeps)

{

return(1);

}

if (ljt)

{

return(-1);

}

l=l+1;

u=p*n+q;

w=p*n+p;

t=q*n+p;

s=q*n+q;

x=-a[u];

y=(a[s]-a[w])/2.0;

omega=x/sqrt(x*x+y*y);

if (y0.0)

{

omega=-omega;

}

sn=1.0+sqrt(1.0-omega*omega);

sn=omega/sqrt(2.0*sn);

cn=sqrt(1.0-sn*sn);

fm=a[w];

a[w]=fm*cn*cn+a[s]*sn*sn+a[u]*omega;

a[s]=fm*sn*sn+a[s]*cn*cn-a[u]*omega;

a[u]=0.0;

a[t]=0.0;

for (j=0; j=n-1; j++)

{

if ((j!=p)(j!=q))

{

u=p*n+j;

w=q*n+j;

fm=a[u];

a[u]=fm*cn+a[w]*sn;

a[w]=-fm*sn+a[w]*cn;

}

}

for (i=0; i=n-1; i++)

{

if ((i!=p)(i!=q))

{

u=i*n+p;

w=i*n+q;

fm=a[u];

a[u]=fm*cn+a[w]*sn;

a[w]=-fm*sn+a[w]*cn;

}

}

for (i=0; i=n-1; i++)

{

u=i*n+p;

w=i*n+q;

fm=v[u];

v[u]=fm*cn+v[w]*sn;

v[w]=-fm*sn+v[w]*cn;

}

}

return(1);

}

矩陣位移法是什麼?

在結構力學的計算中,通過採用對結點位移作為基本未知量,進而通過矩陣的形式堆各基本參數進行組織,編排,求出未知量的方法,稱為矩陣位移法。

按位移法的基本原理運用矩陣計算內力和位移的方法。其基本未知數是結點位移,由於矩陣位移法較矩陣力法更適宜編製通用的計算程序,因而得到了更為廣泛的應用。結構矩陣分析方法首先把結構離散成有限數目的單元,然後再合成為原結構,因而也屬於有限元法。

特點

矩陣數學表達力強,運算簡潔方便並且適於計算機組織運算,是用計算機進行結構數值分析的最強有力的數學工具。矩陣位移法與結構力學的力法和位移法相對應,也就是結構的矩陣分析方法。

矩陣位移法便於編製程序,因而在工程界得到廣泛應用。矩陣位移法並不因採用矩陣數學的描述手段,而改變位移法的基本原理。它與位移法的區別僅僅在於表達形式不同。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/182326.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-24 06:20
下一篇 2024-11-24 06:20

相關推薦

  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智慧、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序文件的拓展

    Python是一門功能豐富、易於學習、可讀性高的編程語言。Python程序文件通常以.py為文件拓展名,被廣泛應用於各種領域,包括Web開發、機器學習、科學計算等。為了更好地發揮P…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Python將矩陣存為CSV文件

    CSV文件是一種通用的文件格式,在統計學和計算機科學中非常常見,一些數據分析工具如Microsoft Excel,Google Sheets等都支持讀取CSV文件。Python內置…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python購物車程序

    Python購物車程序是一款基於Python編程語言開發的程序,可以實現購物車的相關功能,包括商品的添加、購買、刪除、統計等。 一、添加商品 添加商品是購物車程序的基礎功能之一,用…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 爬蟲是一種程序

    爬蟲是一種程序,用於自動獲取互聯網上的信息。本文將從如下多個方面對爬蟲的意義、運行方式、應用場景和技術要點等進行詳細的闡述。 一、爬蟲的意義 1、獲取信息:爬蟲可以自動獲取互聯網上…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29

發表回復

登錄後才能評論