传递矩阵法求简支梁固有频率的近似解 --matlab程序

%传递矩阵法求简支梁固有频率的近似解
clc
clear
syms p q
Sp = sym(‘[1 0 0 0;0 1 0 0;0 0 1 0;x 0 0 1]‘);        %点传递矩阵
Sf = sym(‘[1 1 1/2 1/6;0 1 1 1/2;0 0 1 1;0 0 0 1]‘);  %场传递矩阵
n = input(‘输入划分单元数:‘);
S = ((Sf*Sp)^(n-1))*Sf;         %两端支座之间的传递矩阵
%求固有频率
xs = solve(S(1,2)*S(3,4)-S(1,4)*S(3,2));
xs = sort(double(xs));
xt = xs*n^4;
xt = sqrt(xt);
xe(1:n-1) = (pi*(1:n-1)).^2;    %精确解
xe = xe‘;
fprintf(‘传递矩阵法的结果:\n‘)
for i = 1:n-1
    fprintf(‘第%d阶固有频率:%8.4f(EI/ml^3)^(1/2)\n‘,i,xt(i))
end
%求模态
step = 1/n;
for i = 1:n-1
    f0 = -S(3,2)/S(3,4);
    f0 = subs(f0,‘x‘,xs(i));
    xk(:,1) = [0 1 0 f0]‘;
    for j = 2:n+1
        xk(:,j) = Sf*Sp*xk(:,j-1);
        xk(:,j) = subs(xk(:,j),‘x‘,xs(i));
    end
    xkk = xk(1,2:n);
    xkk = xkk/max(abs(xkk));
    xkk = double(xkk);
    xkk = real(xkk);
    if(xkk(1)<0)
        xkk = -xkk;
    end
    fprintf(‘第%d阶模态为:‘,i)
    disp(xkk)
    figure()
    plot(0:step:1,[0 xkk 0].*abs(sin(i*pi*(0:step:1))),‘ro‘)
    hold on
    xx = 0:pi/200:1;
    plot(xx,sin(i*pi*xx),‘b‘)
end
fprintf(‘精确解的结果:\n‘)
for i = 1:n-1
    fprintf(‘第%d阶固有频率:%8.4f(EI/ml^3)^(1/2)\n‘,i,xe(i))
end

运行结果:

输入划分单元数:5
传递矩阵法的结果:
第1阶固有频率:  9.8684(EI/ml^3)^(1/2)
第2阶固有频率: 39.3808(EI/ml^3)^(1/2)
第3阶固有频率: 87.1779(EI/ml^3)^(1/2)
第4阶固有频率:143.5557(EI/ml^3)^(1/2)
第1阶模态为:    0.6180    1.0000    1.0000    0.6180

第2阶模态为:    1.0000    0.6180   -0.6180   -1.0000

第3阶模态为:    1.0000   -0.6180   -0.6180    1.0000

第4阶模态为:    0.6180   -1.0000    1.0000   -0.6180

精确解的结果:
第1阶固有频率:  9.8696(EI/ml^3)^(1/2)
第2阶固有频率: 39.4784(EI/ml^3)^(1/2)
第3阶固有频率: 88.8264(EI/ml^3)^(1/2)
第4阶固有频率:157.9137(EI/ml^3)^(1/2)

时间: 2024-11-07 20:32:11

传递矩阵法求简支梁固有频率的近似解 --matlab程序的相关文章

弦截法求一元三次方程的近似解

1 #include<stdio.h> 2 #include<math.h> 3 4 //计算一元三次方程的根大致分布位置 5 6 //计算的方程为 x*x*x-8*x*x+12*x-30=0 7 8 //计算函数值 9 float f(float x) 10 { 11 return ((x-8.0)*x+12.0)*x-30.0; 12 } 13 14 //计算弦与坐标x轴的交点 15 16 float xpoint(float x1,float x2) 17 { 18 retu

BZOJ 1057: [ZJOI2007]棋盘制作 悬线法求最大子矩阵+dp

1057: [ZJOI2007]棋盘制作 Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳.而我们的主人公小Q,正是国际象棋的狂热爱好者.作为一个顶尖高手,他已不满足于普通的棋盘与规则,于是他跟他的好朋友小W决定将棋盘扩大以适应他们的新规则.小Q找到了一张由N*M个正方形的格子组成的矩形纸片,每个格子被涂有黑白两种颜色之一.小Q想在这种纸中裁减

特征根法求通项+广义Fibonacci数列找循环节 - HDU 5451 Best Solver

Best Solver Problem's Link Mean: 给出x和M,求:(5+2√6)^(1+2x)的值.x<2^32,M<=46337. analyse: 这题需要用到高中的数学知识点:特征根法求递推数列通项公式. 方法是这样的: 对于这题的解法: 记λ1=5+2√6,λ2=5-2√6,则λ1λ2=1,λ1+λ2=10 根据韦达定理可以推导出:λ1,λ2的特征方程为 x^2-10x+1=0 再使用该特征方程反向推导出递推公式为:a[n]=10*a[n-1]-a[n-2] 再由特征根

矩阵法求解线性回归

由于梯度下降算法需要多次迭代,并且需要指定下降速率,如果下降速度过快则可能错过最优点,如果过慢则需要迭代多次,因此还可选用矩阵法求解. 首先给出一些基本数学知识: 矩阵的迹trace为矩阵主对角线元素之和: tr(a)=a ,如果a为实数 以下是关于矩阵迹的一些性质: 对于多元线性回归,将所有训练数据作为一个矩阵,多元线性回归,也就是多个自变量的线性方程,类似y=a1x1+a2x2+a3x3...: 将y值也作为一个矩阵: 则可得 则误差为: 转变为平方后: 其中转变为平方主要为了统一为正值,前

机器学习中的矩阵向量求导(三) 矩阵向量求导之微分法

在机器学习中的矩阵向量求导(二) 矩阵向量求导之定义法中,我们讨论了定义法求解矩阵向量求导的方法,但是这个方法对于比较复杂的求导式子,中间运算会很复杂,同时排列求导出的结果也很麻烦.因此我们需要其他的一些求导方法.本文我们讨论使用微分法来求解标量对向量的求导,以及标量对矩阵的求导. 本文的标量对向量的求导,以及标量对矩阵的求导使用分母布局.如果遇到其他资料求导结果不同,请先确认布局是否一样. 1. 矩阵微分 在高数里面我们学习过标量的导数和微分,他们之间有这样的关系:$df =f'(x)dx$.

线性回归之标准方程法求损失函数最小值

在吴恩达-人工智能视频学习过程中,关于线性回归之标准方程法求损失函数最小值,比较经典的两处截图: 图1 图2 关于图2的证明,其实有个简单的思路.在电脑上打数字公式太为难了,我还是在纸上写吧: 先将图1的X矩阵转置为1行n列.那么就有 更详细的推演可以参考: https://blog.csdn.net/zhangbaodan1/article/details/81013056 具体编码实现:下图@改为乘号* 在前文https://www.cnblogs.com/myshuzhimei/p/117

筛选法求素数

筛选法求素数,不断的用3,5,7,等素数作为筛子,筛除这些数的倍数,即将合数筛除.用辅助数组p记录数i是否是素数. vector<int> prime(int n) { vector<int> p(n+1); for(int i=2;i<=n;i+=2) { if(i%2==0&&i>2) p[i]=0; else p[i]=1; } for(int i=3;i<=(int)(sqrt((double)n));i+=2) { if(p[i]) fo

欧几里得算法求最大公约数(gcd)

关于欧几里得算法求最大公约数算法, 代码如下: int gcd( int a , int b ) { if( b == 0 ) return a ; else gcd( b , a % b ) ; } 证明: 对于a,b,有a = kb + r  (a , k , b , r 均为整数),其中r = a mod b . 令d为a和b的一个公约数,则d|a,d|b(即a.b都被d整除), 那么 r =a - kb ,两边同时除以d 得 r/d = a/d - kb/d = m (m为整数,因为r也

【算法】普通方法和筛选法求素数

素数指的是因子只有1和本身的数(1不是素数),求解素数在数学上应用非常广泛,而求解n以内的素数也是我们编程时常遇到的问题,在这个问题上,筛选法求解素数运行得非常快.下面首先介绍如何判断一个是不是素数,然后介绍用普通方法求n以内的素数,接着是筛选法求n以内的素数,最后是两种算法的运行时间比较 判断一个数是不是素数 算法思想:判断小于等于一个数的平方的所有大于1的整数是不是能整除这个数,如果能,则表明这个数不是素数:反之,则是素数. //判断一个数是否为素数 bool isPlain(int val