FEM_SFT_11.17

第1章:MATLAB编程语言概述

  1. 二分法编程示例
% 二分法求根示例
function root = bisection_method(a, b, tol)
    % 检查区间两端点的函数值是否具有相反的符号
    if sign(func(a)) == sign(func(b))
        error('区间两端点的函数值必须具有相反的符号。');
    end
    % 迭代直到达到指定的容差
    while (b - a) / 2 > tol
        c = (a + b) / 2;
        % 检查中点是否已经是根
        if func(c) == 0
            root = c;
            return;
        elseif sign(func(c)) == sign(func(a))
            a = c;
        else
            b = c;
        end
    end
    root = (a + b) / 2;
end

% 定义要求根的函数
function y = func(x)
    y = x^3 - 2*x - 5;
end
  1. 牛顿-拉夫森法编程示例
% 牛顿-拉夫森法求根示例
function root = newton_raphson_method(x0, tol)
    % 迭代直到达到指定的容差
    while true
        fx = func(x0);
        dfx = deriv_func(x0);
        % 计算下一个近似值
        x1 = x0 - fx / dfx;
        % 检查是否满足收敛条件
        if abs(x1 - x0) < tol
            root = x1;
            return;
        end
        x0 = x1;
    end
end

% 定义要求根的函数
function y = func(x)
    y = x^3 - 2*x - 5;
end

% 定义要求根函数的导数
function y = deriv_func(x)
    y = 3*x^2 - 2;
end
  1. 高斯-牛顿算法编程示例(非线性回归)
% 高斯-牛顿算法用于非线性回归示例
% Kian Aghani & Salar Farahmand-Tabar (2023)
clear; clc
% 输入数据
y = [0.05 0.127 0.094 0.2122 0.2729 0.2665 0.3317];
x = [0.038 0.194 0.426 0.626 1.253 2.5 3.74];

m = 2;
n = length(x);
a0 = ones(2, 1);
maxiter = 500;
jacobian = zeros(n, m);
errorMat = zeros(n, 1);
toler = 0.0001;

for iter = 1:maxiter
    for k = 1:n
        dRda = -x(k) / (x(k) + a0(2));
        dTdb = x(k) * a0(1) / (x(k) + a0(2))^2;
        jacobian(k, 1) = dRda;
        jacobian(k, 2) = dTdb;
        Ytest = x(k) * a0(1) / (x(k) + a0(2));
        errorMat(k) = y(k) - Ytest;
    end
    normError = norm(errorMat);
    delta = - (jacobian' * jacobian) \ jacobian' * errorMat;
    a0 = a0 + delta;
    plot(iter, normError, 'k--o');
    hold on;
    if norm(delta) < toler
        h = ['收敛在:', num2str(iter), '次迭代后'];
        disp(h);
        break;
    end
end
xlabel('迭代');
ylabel('误差');
disp(a0);
fun = @(a0, x) a0(1) * x./ (a0(2) + x);
figure;
plot(x, y, 'bo', x, fun(a0, x), 'k');
legend('数据', '回归');
xlabel('x');
ylabel('y');

第2章:框架结构的矩阵分析

  1. 平面桁架相关函数
    • planetruss函数
function [S] = planetruss(E, A, Wd, element, elementcon, xcord, ycord)
    S = zeros(Wd, Wd);
    for i = 1:element
        dof = elementcon(i, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [l m 0 0; 0 0 l m];
        k = (E * A / L) * [1 -1; -1 1];
        K = R' * k * R;
        index = [dof(1) * 2 - 1 dof(1) * 2 dof(2) * 2 - 1 dof(2) * 2];
        S(index, index) = S(index, index) + K;
    end
end
- `drawplanetruss`函数
function drawplanetruss(element, elementcon, nodecord, newcord, Snewcord)
    a = max(Snewcord(:, 1));
    b = min(nodecord(:, 1));
    x0 = b(1) - 2;
    x1 = a(1) * 1.2;
    y0 = 0;
    y1 = a(2) * 1.2;
    for n = 1:element
        dof = elementcon(n, :);
        xx = [nodecord(dof(1), 1), nodecord(dof(2), 1)];
        yy = [nodecord(dof(1), 2), nodecord(dof(2), 2)];
        xxn = [Snewcord(dof(1), 1), Snewcord(dof(2), 1)];
        yyn = [Snewcord(dof(1), 2), Snewcord(dof(2), 2)];
        plot(xx, yy, '-.k', xxn, yyn, 'k');
        grid on;
        title('Scaled Deformation');
        xlabel('Horizontal Deformation');
        ylabel('Vertical deformation');
        axis([x0, x1, y0, y1]);
        hold on;
    end
end
- `trussforce`函数
function [p] = trussforce(E, A, element, elementcon, xcord, ycord, U)
    p = zeros(element, 1);
    for j = 1:element
        dof = elementcon(j, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        index = [dof(1) * 2 - 1 dof(1) * 2 dof(2) * 2 - 1 dof(2) * 2];
        T = [l m];
        p(j) = E * A * T * U(index) / L;
    end
end
  1. 空间桁架相关函数
    • spacetruss函数
function [S] = spacetruss(E, A, Wd, element, elementcon, xcord, ycord, zcord)
    S = zeros(Wd, Wd);
    for i = 1:element
        dof = elementcon(i, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        z = zcord(dof(2)) - zcord(dof(1));
        L = sqrt(x^2 + y^2 + z^2);
        l = x / L;
        m = y / L;
        n = z / L;
        R = [l m n 0 0 0; 0 0 0 l m n];
        k = (E * A / L) * [1 -1; -1 1];
        K = R' * k * R;
        index = [dof(1) * 3 - 2:dof(1) * 3 dof(2) * 3 - 2:dof(2) * 3];
        S(index, index) = S(index, index) + K;
    end
end
- `spacetrussforce`函数
function [p] = spacetrussforce(E, A, element, elementcon, xcord, ycord, zcord, U)
    p = zeros(element, 1);
    for j = 1:element
        dof = elementcon(j, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        z = zcord(dof(2)) - zcord(dof(1));
        L = sqrt(x^2 + y^2 + z^2);
        l = x / L;
        m = y / L;
        n = z / L;
        index = [dof(1) * 3 - 2:dof(1) * 3 dof(2) * 3 - 2:dof(2) * 3];
        T = [-l -m -n l m n];
        p(j) = E * A * T * U(index) / L;
    end
end
  1. 平面框架相关函数
    • planeframe函数
function [S] = planeframe(E, A, I, Wd, element, elementcon, xcord, ycord)
    S = zeros(Wd, Wd);
    for j = 1:element
        dof = elementcon(j, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [l m 0 0 0 0; -m l 0 0 0 0; 0 0 1 0 0 0; 0 0 0 l m 0; 0 0 0 -m l 0; 0 0 0 0 0 1];
        k = E * [A / L 0 0 -A / L 0 0; 0 12 * I / L^3 6 * I / L^2 0 -12 * I / L^3 6 * I / L^2; 0 6 * I / L^2 4 * I / L 0 -6 * I / L^2 2 * I / L; -A / L 0 0 A / L 0 0; 0 -12 * I / L^3 -6 * I / L^2 0 12 * I / L^3 -6 * I / L^2; 0 6 * I / L^2 2 * I / L 0 -6 * I / L^2 4 * I / L];
        K = R' * k * R;
        index = [3 * dof(1) - 2:3 * dof(1) 3 * dof(2) - 2:3 * dof(2)];
        S(index, index) = S(index, index) + K;
    end
end
- `drawplaneframe`函数
function drawplaneframe(element, elementcon, nodecord, newcord, newcord)
    a = max(Snewcord(:, 1));
    b = min(Snewcord(:, 1));
    c = max(Snewcord(:, 2));
    d = min(Snewcord(:, 2));
    x0 = b * 1.3 - 1;
    x1 = a * 1.3 + 1;
    y0 = d * 1.3 - 1;
    y1 = c * 1.3 + 1;
    for n = 1:element
        dof = elementcon(n, :);
        xx = [nodecord(dof(1), 1), nodecord(dof(2), 1)];
        yy = [nodecord(dof(1), 2), nodecord(dof(2

### 第2章:框架结构的矩阵分析(续)
1. **平面框架相关函数(续)**
```matlab
function drawplaneframe(element, elementcon, nodecord, newcord, newcord)
    a = max(Snewcord(:, 1));
    b = min(Snewcord(:, 1));
    c = max(Snewcord(:, 2));
    d = min(Snewcord(:, 2));
    x0 = b * 1.3 - 1;
    x1 = a * 1.3 + 1;
    y0 = d * 1.3 - 1;
    y1 = c * 1.3 + 1;
    for n = 1:element
        dof = elementcon(n, :);
        xx = [nodecord(dof(1), 1), nodecord(dof(2), 1)];
        yy = [nodecord(dof(1), 2), nodecord(dof(2), 2)];
        xxn = [Snewcord(dof(1), 1), Snewcord(dof(2), 1)];
        yyn = [Snewcord(dof(1), 2), Snewcord(dof(2), 2)];
        plot(xx, yy, '-.k', xxn, yyn, 'k');
        grid on;
        title('Scaled Deformation');
        xlabel('Horizontal Deformation');
        ylabel('Vertical deformation');
        axis([x0, x1, y0, y1]);
        hold on;
    end
end
  1. 空间框架相关函数
    • spaceframe函数
function [S] = spaceframe(E, A, Ge, IZ, IY, J, Wd, element, elementcon, xcord, ycord, zcord, beta)
    S = zeros(Wd, Wd);
    for j = 1:element
        dof = elementcon(j, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        z = zcord(dof(2)) - zcord(dof(1));
        if xcord(dof(2)) == xcord(dof(1)) && ycord(dof(2)) == ycord(dof(1))
            if zcord(dof(2)) > zcord(dof(1))
                T = [0 0 1; 0 1 0; -1 0 0];
            else
                T = [0 0 -1; 0 1 0; 1 0 0];
            end
        else
            L = sqrt(x^2 + y^2 + z^2);
            l = x / L;
            m = y / L;
            n = z / L;
            D = sqrt(l^2 + m^2);
            T = [l m n; -m / D l / D 0; -l * n / D -m * n / D D];
        end
        b = beta(j);
        bb = [1 0 0; 0 cos(b) sin(b); 0 -sin(b) cos(b)];
        ZZ = zeros(3, 3);
        B = [bb ZZ ZZ ZZ; ZZ bb ZZ ZZ; ZZ ZZ bb ZZ; ZZ ZZ ZZ bb];
        R = [T ZZ ZZ ZZ; ZZ T ZZ ZZ; ZZ ZZ T ZZ; ZZ ZZ ZZ T];
        k1 = E * [A / L 0 0 0 0 0 0 12 * IZ / L^3 0 0 0 6 * IZ / L^2 0 0 12 * IY / L^3 0 -6 * IY / L^2 0; 0 0 0 Ge * J / (L * E) 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 6 * IZ / L^2 0 0 0 4 * IZ / L 0 0 -6 * IY / L^2 0 0 0 2 * IY / L 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
        k2 = E * [-A / L 0 0 0 0 0 0 0 -6 * IY / L^2 0 4 * IY / L 0 0 6 * IZ / L^2 0 0 0 4 * IZ / L; 0 0 0 -Ge * J / (L * E) 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 -6 * IZ / L^2 0 0 0 2 * IZ / L 0 0 6 * IY / L^2 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
        k3 = k2';
        k4 = E * [A / L 0 0 0 0 0 0 -6 * IZ / L^2 0 0 0 2 * IZ / L; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 6 * IZ / L^2 0 0 0 4 * IZ / L 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0; 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
        k = [k1 k2; k3 k4];
        K = R' * B' * k * B * R;
        index = [6 * dof(1) - 5:6 * dof(1) 6 * dof(2) - 5:6 * dof(2)];
        S(index, index) = S(index, index) + K;
    end
end
- `drawspaceframe`函数
function drawspaceframe(element, elementcon, nodecord, newcord, Snewcord)
    for n = 1:element
        dof = elementcon(n, :);
        xx = [nodecord(dof(1), 1), nodecord(dof(2), 1)];
        yy = [nodecord(dof(1), 2), nodecord(dof(2), 2)];
        zz = [nodecord(dof(1), 3), nodecord(dof(2), 3)];
        xxn = [Snewcord(dof(1), 1), Snewcord(dof(2), 1)];
        yyn = [Snewcord(dof(1), 2), Snewcord(dof(2), 2)];
        zzn = [Snewcord(dof(1), 3), Snewcord(dof(2), 3)];
        plot3(zz, xx, yy, '-.k', zzn, xxn, yyn, 'k');
        grid on;
        title('Scaled Deformation');
        hold on;
    end
end
  1. 网格相关函数
    • grid函数
function [S] = grid(E, I, Ge, J, Wd, element, elementcon, xcord, ycord)
    S = zeros(Wd, Wd);
    for j = 1:element
        dof = elementcon(j, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [1 0 0 0 0 0; 0 -l -m 0 0 0; 0 m -l 0 0 0; 0 0 0 1 0 0; 0 0 0 0 -l -m; 0 0 0 0 m -l];
        k1 = E * [12 * I / L^3 0 6 * I / L^2; 0 Ge * J / (E * L) 0; 6 * I / L^2 0 4 * I / L];
        k2 = E * [-12 * I / L^3 0 6 * I / L^2; 0 -Ge * J / (E * L) 0; -6 * I / L^2 0 2 * I / L];
        k3 = k2';
        k4 = E * [12 * I / L^3 0 -6 * I / L^2; 0 Ge * J / (E * L) 0; -6 * I / L^2 0 4 * I / L];
        k = [k1 k2; k3 k4];
        K = R' * k * R;
        index = [3 * dof(1) - 2:3 * dof(1) 3 * dof(2) - 2:3



### 第2章:框架结构的矩阵分析(续)
3. **网格相关函数(续)**
```matlab
function [S] = grid(E, I, Ge, J, Wd, element, elementcon, xcord, ycord)
    S = zeros(Wd, Wd);
    for j = 1:element
        dof = elementcon(j, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [1 0 0 0 0 0; 0 -l -m 0 0 0; 0 m -l 0 0 0; 0 0 0 1 0 0; 0 0 0 0 -l -m; 0 0 0 0 m -l];
        k1 = E * [12 * I / L^3 0 6 * I / L^2; 0 Ge * J / (E * L) 0; 6 * I / L^2 0 4 * I / L];
        k2 = E * [-12 * I / L^3 0 6 * I / L^2; 0 -Ge * J / (E * L) 0; -6 * I / L^2 0 2 * I / L];
        k3 = k2';
        k4 = E * [12 * I / L^3 0 -6 * I / L^2; 0 Ge * J / (E * L) 0; -6 * I / L^2 0 4 * I / L];
        k = [k1 k2; k3 k4];
        K = R' * k * R;
        index = [3 * dof(1) - 2:3 * dof(1) 3 * dof(2) - 2:3 * dof(2)];
        S(index, index) = S(index, index) + K;
    end
end
- `drawgrid`函数
function drawgrid(element, elementcon, nodecord, Snewcord)
    for n = 1:element
        dof = elementcon(n, :);
        xx = [nodecord(dof(1), 1), nodecord(dof(2), 1)];
        zz = [nodecord(dof(1), 2), nodecord(dof(2), 2)];
        yy = [nodecord(dof(1), 3), nodecord(dof(2), 3)];
        xxn = [Snewcord(dof(1), 1), Snewcord(dof(2), 1)];
        zzn = [Snewcord(dof(1), 2), Snewcord(dof(2), 2)];
        yyn = [Snewcord(dof(1), 3), Snewcord(dof(2), 3)];
        plot3(yy, zz, xx, 'k-.', yyn, zzn, xxn, 'k');
        title('Scaled deformation');
        xlabel('z');
        ylabel('x');
        zlabel('y');
        hold on;
    end
end
  1. 特殊情况处理相关函数
    • nodeforces函数(处理构件荷载)
function [F] = nodeforces(Wd, eledist, loaddefiner, loaddist, xcord, ycord, option, F)
    for k = 1:size(eledist, 1)
        OPT = option(k, :);
        dof = eledist(k, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [l m 0 0 0 0; -m l 0 0 0 0; 0 0 1 0 0 0; 0 0 0 l m 0; 0 0 0 -m l 0; 0 0

### 第2章:框架结构的矩阵分析(续)
4. **特殊情况处理相关函数(续)**
```matlab
function [F] = nodeforces(Wd, eledist, loaddefiner, loaddist, xcord, ycord, option, F)
    for k = 1:size(eledist, 1)
        OPT = option(k, :);
        dof = eledist(k, :);
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [l m 0 0 0 0; -m l 0 0 0 0; 0 0 1 0 0 0; 0 0 0 l m 0; 0 0 0 -m l 0; 0 0 0 0 0 1];
        switch OPT
            case 'dist'
                a1 = loaddefiner(k, 1);
                a2 = loaddefiner(k, 2);
                b = loaddefiner(k, 3);
                dist = loaddist(k, :)';
                c1 = b * (L - a1 - b / 2) / L;
                c2 = (2 * b * L - 2 * ((a1 + b)^3 - a1^3) / L + ((a1 + b)^4 - a1^4) / L^2) / (2 * L);
                c3 = (6 * L^2 * ((a1 + b)^2 - a1^2) - 8 * L * ((a1 + b)^3 - a1^3) + 3 * ((a1 + b)^4 - a1^4)) / (12 * L^2);
                c4 = b * (L - a2 - b / 2) / L;
                c5 = (2 * b * L - 2 * ((a2 + b)^3 - a2^3) / L + ((a2 + b)^4 - a2^4) / L^2) / (2 * L);
                c6 = (6 * L^2 * ((a2 + b)^2 - a2^2) - 8 * L * ((a2 + b)^3 - a2^3) + 3 * ((a2 + b)^4 - a2^4)) / (12 * L^2);
            case 'conc'
                a1 = loaddefiner(k, 1);
                a2 = loaddefiner(k, 2);
                b = loaddefiner(k, 3);
                dist = loaddist(k, :)';
                c1 = (L - a1) / L;
                c2 = ((L - a1)^2 * (L + 2 * a1)) / L^3;
                c3 = (a1 * (L - a1)^2) / L^2;
                c4 = (L - a2) / L;
                c5 = ((L - a2)^2 * (L + 2 * a2)) / L^3;
                c6 = (a2 * (L - a2)^2) / L^2;
        end
        C = [-c1 0 0 0 0 0; 0 -c2 0 0 0 0; 0 -c3 0 0 0 0; 0 0 0 -c4 0 0; 0 0 0 0 -c5 0; 0 0 0 0 0 -c6];
        pij = C * R * dist;
        index = [3 * dof(1) - 2:3 * dof(1) 3 * dof(2) - 2:3 * dof(2)];
        F(index) = F(index) + (-R' * pij);
    end
end
- `settle`函数(处理支座沉降)
function [F] = settle(E, A, I, Wd, elementcon, settleelement, settlevalue, settlenode, xcord, ycord, F)
    n = size(settleelement, 1);
    for i = 1:n
       

### 第2章:框架结构的矩阵分析(续)
4. **特殊情况处理相关函数(续)**
```matlab
function [F] = settle(E, A, I, Wd, elementcon, settleelement, settlevalue, settlenode, xcord, ycord, F)
    n = size(settleelement, 1);
    for i = 1:n
        connect = settleelement(i, :);
        x = xcord(connect(2)) - xcord(connect(1));
        y = ycord(connect(2)) - ycord(connect(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        kij = E * [-A / L 0 0; 0 -12 * I / L^3 6 * I / L^2; 0 -6 * I / L^2 2 * I / L];
        R = [l m 0; -m l 0; 0 0 1];
        if connect(1) == settlenode(i)
            delta1 = settlevalue(i, :)';
            p = kij' * R * delta1;
            index = [3 * connect(2) - 2 3 * connect(2) - 1 3 * connect(2)];
        else
            delta2 = settlevalue(i, :)';
            index = [3 * connect(1) - 2 3 * connect(1) - 1 3 * connect(1)];
            p = kij * R * delta2;
        end
        P = -R' * p;
        F(index) = F(index) + P;
    end
end
- `temperature`函数(处理温度变化)
function [F] = temperature(E, A, I, h, alfa, Wd, tempelement, temperaturedeg, elementcon, xcord, ycord, F)
    n = size(tempelement, 1);
    for i = 1:n
        T1 = temperaturedeg(i, 1);
        T2 = temperaturedeg(i, 2);
        connect = tempelement(i, :);
        x = xcord(connect(1)) - xcord(connect(2));
        y = ycord(connect(1)) - ycord(connect(2));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        Rij = [l m 0; -m l 0; 0 0 1];
        Rji = [-l -m 0; m -l 0; 0 0 1];
        pij = alfa * [-E * A * (T2 + T1) / 2; 0; E * I * (T1 - T2) / h];
        pji = alfa * [-E * A * (T2 + T1) / 2; 0; E * I * (T2 - T1) / h];
        Pi = -Rij' * pij;
        Pj = -Rji' * pji;
        P = [Pi; Pj];
        index = [3 * connect(1) - 2:3 * connect(1) 3 * connect(2) - 2:3 * connect(2)];
        F(index) = F(index) + P;
    end
end
- `aberration`函数(处理构件不匹配)
function [F] = aberration(E, A, I, Wd, abelement, abvalue, xcord, ycord, option, F)
    n = size(abelement, 1);
    for i = 1:n
        dof = abelement(i, :);
        switch option
            case 'truss'
                index1 = [dof(1) * 2 - 1 dof(1) * 2];
                index2 = [dof(2) * 2 - 1 dof(2) * 2];
                x = xcord(dof(2)) - xcord(dof(1));
                y = ycord(dof(2)) - ycord(dof(1));
                L = sqrt(x^2 + y^2);
                l = x / L;
                m = y / L;
                R = [l m];
                k

### 第2章:框架结构的矩阵分析(续)
4. **特殊情况处理相关函数(续)**
```matlab
function [F] = aberration(E, A, I, Wd, abelement, abvalue, xcord, ycord, option, F)
    n = size(abelement, 1);
    for i = 1:n
        dof = abelement(i, :);
        switch option
            case 'truss'
                index1 = [dof(1) * 2 - 1 dof(1) * 2];
                index2 = [dof(2) * 2 - 1 dof(2) * 2];
                x = xcord(dof(2)) - xcord(dof(1));
                y = ycord(dof(2)) - ycord(dof(1));
                L = sqrt(x^2 + y^2);
                l = x / L;
                m = y / L;
                R = [l m];
                kii = (E * A / L);
                kij = -kii;
                delta = abvalue(i);
            case 'frame2d'
                index1 = [3 * dof(1) - 2 3 * dof(1) - 1 3 * dof(1)];
                index2 = [3 * dof(2) - 2 3 * dof(2) - 1 3 * dof(2)];
                x = xcord(dof(2)) - xcord(dof(1));
                y = ycord(dof(2)) - ycord(dof(1));
                L = sqrt(x^2 + y^2);
                l = x / L;
                m = y / L;
                R = [l m 0; -m l 0; 0 0 1];
                kii = E * [A / L 0 0; 0 12 * I / L^3 6 * I / L^2; 0 6 * I / L^2 4 * I / L];
                kij = E * [-A / L 0 0; 0 -12 * I / L^3 6 * I / L^2; 0 -6 * I / L^2 2 * I / L];
                delta = [abvalue(i) 0 0];
        end
        pij = kii * delta;
        pji = kij * delta;
        Pi = -R' * pij;
        Pj = -R' * pji;
        F(index1) = F(index1) + Pi;
        F(index2) = F(index2) + Pj;
    end
end
- `discon`函数(处理释放端条件)
function [S] = discon(E, A, I, Wd, element, elementcon, xcord, ycord, disc, option)
    S = zeros(Wd, Wd);
    n = size(disc, 1);
    for j = 1:element - n
        dof = elementcon(j, :);
        index = [3 * dof(1) - :3 * dof(1) 3 * dof(2) - :3 * dof(2)];
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [l m 0 0 0 0; -m l 0 0 0 0; 0 0 1 0 0 0; 0 0 0 l m 0; 0 0 0 -m l 0; 0 0 0 0 0 1];
        k = E * [A / L 0 0 -A / L 0 0; 0 12 * I / L^3 6 * I / L^2 0 -12 * I / L^3 6 * I / L^2; 0 6 * I / L^2 4 * I / L 0 -6 * I / L^2 2 * I / L; -A / L 0 0 A / L 0 0; 0 -12 *


### 第2章:框架结构的矩阵分析(续)
4. **特殊情况处理相关函数(续)**
```matlab
function [S] = discon(E, A, I, Wd, element, elementcon, xcord, ycord, disc, option)
    S = zeros(Wd, Wd);
    n = size(disc, 1);
    for j = 1:element - n
        dof = elementcon(j, :);
        index = [3 * dof(1) - :3 * dof(1) 3 * dof(2) - :3 * dof(2)];
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [l m 0 0 0 0; -m l 0 0 0 0; 0 0 1 0 0 0; 0 0 0 l m 0; 0 0 0 -m l 0; 0 0 0 0 0 1];
        k = E * [A / L 0 0 -A / L 0 0; 0 12 * I / L^3 6 * I / L^2 0 -12 * I / L^3 6 * I / L^2; 0 6 * I / L^2 4 * I / L 0 -6 * I / L^2 2 * I / L; -A / L 0 0 A / L 0 0; 0 -12 * I / L^3 -6 * I / L^2 0 12 * I / L^3 -6 * I / L^2; 0 6 * I / L^2 2 * I / L 0 -6 * I / L^2 4 * I / L];
        K = R' * k * R;
        S(index, index) = S(index, index) + K;
    end
    for ii = 1:n
        dof = disc(ii, :);
        OPT = option(ii, :);
        index = [3 * dof(1) - 2 3 * dof(1) - 1 3 * dof(1) 3 * dof(2) - 2 3 * dof(2) - 1 3 * dof(2)];
        x = xcord(dof(2)) - xcord(dof(1));
        y = ycord(dof(2)) - ycord(dof(1));
        L = sqrt(x^2 + y^2);
        l = x / L;
        m = y / L;
        R = [l m 0 0 0 0; -m l 0 0 0 0; 0 0 1 0 0 0; 0 0 0 l m 0; 0 0 0 -m l 0; 0 0 0 0 0 1];
        switch OPT
            case 'pin'
                k1 = E * [A / L 0 0; 0 3 * I / L^3 0; 0 0 0];
                k2 = E * [A / L 0 0; 0 -3 * I / L^3 3 * I / L^2; 0 0 0];
                k3 = E * [A / L 0 0; 0 3 * I / L^3 -3 * I / L^2; 0 -3 * I / L^2 3 * I / L];
                k = [k1 k2; k2' k3];
            case 'trs'
                k1 = E * [A / L 0 0; 0 0 0; 0 0 0];
                k2 = E * [-A / L 0 0; 0 0 0; 0 0 0];
                k3 = E * [A / L 0 0; 0 0 0; 0 0 0];
                k = [k1 k2; k2' k3];
            case 'shr'
                k1 = E * [A


### 第3章:使用有限元程序进行结构的弹性分析
1. **获取高斯积分点坐标和权重的函数**
```matlab
function [point, weight] = gausslegendre(number)
    switch number
        case 'one'
            point = [0];
            weight = [2];
        case 'two'
            point = [-0.577350269189626; 0.577350269189626];
            weight = [1; 1];
        case 'three'
            point = [-.774596669241483; 0;.774596669241483];
            weight = [.555555555555555;.888888888888888;.555555555555555];
        case 'four'
            point = [-.861136311594053; -.339981043584856;.339981043584856;.861136311594053];
            weight = [.347854845137454;.652145154862546;.652145154862546;.347854845137454];
    end
end
  1. 计算一维单元插值(形状)函数及其导数的函数
function [shape, RDerivatives] = shapeR(r, option)
    switch option
        case 'twonode'
            shape = [(1 - r) (1 + r)] / 2;
            RDerivatives = [-1 1] / 2;
        case 'threenode'
            shape = [(1 - r) - (1 - r^2) (1 + r) - (1 - r^2) 2 * (1 - r^2)] / 2;
            RDerivatives = [2 * r - 1 2 * r + 1 -4 * r] / 2;
        case 'fournode'
            shape = [(1 - r) - (1 - r^2) + (-9 * r^3 + r^2 + 9 * r - 1) / 8 (1 + r) - (1 - r^2) + (9 * r^3 + r^2 - 9 * r - 1) / 8 2 * (1 - r^2) + (27 * r^3 + 7 * r^2 - 27 * r - 7) / 8 (-27 * r^3 - 9 * r^2 + 27 * r + 9) / 8] / 2;
            RDerivatives = [(9 * r) / 4 - (27 * r^2) / 8 + 1 / 8 (27 * r^2) / 8 + (9 * r) / 4 - 1 / 8 (81 * r^2) / 8 - (9 * r) / 4 - 27 / 8 27 / 8 - (81 * r^2) / 8 - (9 * r) / 4] / 2;
    end
end
  1. 计算二维结构刚度矩阵(平面应力、平面应变)的函数
function [S] = continuum2d(Wd, C, N, NodeNumbertotal, thickness, nodes, cord, gausepoint, weight, option)
    S = zeros(Wd, Wd);
    for i = 1:N
        dof = nodes(i, :);
        eledof = [dof dof + NodeNumbertotal];
        betaLength = length(dof);
        for j = 1:size(gausepoint, 1)
            point = gausepoint(j, :);
            r = point(1);
            s = point(2);
            [shape, RSderivation] = shapeStress(r, s, option);
            elecord = cord(dof, :);
            [XYderivation, Jacob

### 第4章:使用有限元程序进行结构的弹塑性分析
1. **计算变形梯度、拉格朗日应变和第二Piola - Kirchhoff应力的相关代码片段(示例)**
   - 计算变形梯度(以平面应变条件下的弯曲和牵引荷载为例,在主程序中可能的计算方式)
```matlab
% 假设已经定义了节点坐标node和位移向量U
for i = 1:length(node)
    x(i) = node(i, 1) + U(2 * i - 1);
    y(i) = node(i, 2) + U(2 * i);
end
% 计算变形梯度F
for i = 1:length(element)
    node1 = element(i, 1);
    node2 = element(i, 2);
    dx_dX = (x(node2) - x(node1)) / (node(node2, 1) - node(node1, 1));
    dy_dX = (y(node2) - y(node1)) / (node(node2, 1) - node(node1, 1));
    dx_dY = 0; % 平面应变假设
    dy_dY = 1; % 平面应变假设
    F(i, :, :) = [dx_dX dx_dY; dy_dX dy_dY];
end
  • 计算拉格朗日应变(基于上述计算的变形梯度F)
E = zeros(length(element), 3);
for i = 1:length(element)
    F_i = F(i, :, :);
    E(i, 1) = 0.5 * (F_i(1, 1)^2 + F_i(2, 1)^2 - 1); % E_xx
    E(i, 2) = 0.5 * (F_i(1, 2)^2 + F_i(2, 2)^2 - 1); % E_yy
    E(i, 3) = F_i(1, 1) * F_i(1, 2) + F_i(2, 1) * F_i(2, 2); % E_xy
end
  • 计算第二Piola - Kirchhoff应力(假设材料参数已定义,如弹性模量E和泊松比nu,以平面应力为例)
C = E / (1 - nu^2) * [1 nu 0; nu 1 0; 0 0 (1 - nu) / 2]; % 平面应力本构矩阵
S = zeros(length(element), 3);
for i = 1:length(element)
    E_i = [E(i, 1); E(i, 2); E(i, 3)];
    S(i, :) = C * E_i;
end
  1. 应力积分相关函数(以结合等向/随动硬化的材料为例,可能涉及的计算过程,未完整封装函数)
    • 计算等效塑性应变增量(根据公式计算,可能在迭代过程中调用)
function [DeltaEpsilonP] = calculateDeltaEpsilonP(hatSigmaPr, SigmaY, G, C, M)
    % 计算混合硬化斜率
    hatC = (1 - M) * C;
    % 计算函数f(DeltaEpsilonP)的值
    f = @(DeltaEpsilonP) hatSigmaPr / (SigmaY + (3 / 2) * (2 * G + hatC) * DeltaEpsilonP) - 1;
    % 使用牛顿 - 拉夫森法迭代求解DeltaEpsilonP
    DeltaEpsilonP = newtonRaphsonSolve(f, initialGuess, tolerance);
end
  • 更新应力分量(根据计算得到的等效塑性应变增量等参数更新应力)
function [sigma] = updateStress(hatSigmaPr, SigmaY, eta, alpha0, DeltaAlpha, G, C, M)
    hatC = (1 - M) * C;
    % 根据公式计算新的应力分量
    sigma = zeros(6, 1); % 假设应力向量维度为6(根据具体问题调整)
    for i = 1:6
        sigma(i) = sigmaPr(i) + eta(i) * SigmaY + alpha0(i) + DeltaAlpha(i);
    end
end
  1. 求解非线性问题相关代码片段(如牛顿 - 拉夫森迭代法的应用示例,在主程序中可能的实现方式)

第5章:有限变形与超弹性

  1. 计算变形梯度、拉格朗日应变和第二Piola - Kirchhoff应力的相关代码片段(示例)
    • 计算变形梯度(以平面应变条件下的弯曲和牵引荷载为例,在主程序中可能的计算方式)
% 假设已经定义了节点坐标node和位移向量U
for i = 1:length(node)
    x(i) = node(i, 1) + U(2 * i - 1);
    y(i) = node(i, 2) + U(2 * i);
end
% 计算变形梯度F
for i = 1:length(element)
    node1 = element(i, 1);
    node2 = element(i, 2);
    dx_dX = (x(node2) - x(node1)) / (node(node2, 1) - node(node1, 1));
    dy_dX = (y(node2) - y(node1)) / (node(node2, 1) - node(node1, 1));
    dx_dY = 0; % 平面应变假设
    dy_dY = 1; % 平面应变假设
    F(i, :, :) = [dx_dX dx_dY; dy_dX dy_dY];
end
  • 计算拉格朗日应变(基于上述计算的变形梯度F)
E = zeros(length(element), 3);
for i = 1:length(element)
    F_i = F(i, :, :);
    E(i, 1) = 0.5 * (F_i(1, 1)^2 + F_i(2, 1)^2 - 1); % E_xx
    E(i, 2) = 0.5 * (F_i(1, 2)^2 + F_i(2, 2)^2 - 1); % E_yy
    E(i, 3) = F_i(1, 1) * F_i(1, 2) + F_i(2, 1) * F_i(2, 2); % E_xy
end
  • 计算第二Piola - Kirchhoff应力(假设材料参数已定义,如弹性模量E和泊松比nu,以平面应力为例)
C = E / (1 - nu^2) * [1 nu 0; nu 1 0; 0 0 (1 - nu) / 2]; % 平面应力本构矩阵
S = zeros(length(element), 3);
for i = 1:length(element)
    E_i = [E(i, 1); E(i, 2); E(i, 3)];
    S(i, :) = C * E_i;
end
  1. 超弹性材料拟合相关代码片段(以neo - Hookean模型为例,可能的实现方式)
    • 定义neo - Hookean模型函数
function [stress] = neoHookeanModel(lambda, mu, F)
    % 计算变形梯度的行列式
    J = det(F);
    % 计算右柯西 - 格林变形张量
    C = F' * F;
    % 计算不变量
    I1 = trace(C);
    % 计算应力
    stress = 2 * mu * (F - 1 / 2 * I1 * eye(3)) + lambda * log(J) * eye(3);
end
  • 进行数据拟合(假设实验数据为stressData和stretchData)
% 初始参数猜测
lambda0 = 100; % 初始拉梅常数lambda猜测值
mu0 = 50; % 初始剪切模量mu猜测值
% 定义优化选项
options = optimset('MaxIter', 1000, 'TolFun', 1e-6);
% 使用最小二乘法拟合模型参数
[params, residual] = lsqcurvefit(@neoHookeanModel, [lambda0, mu0], stretchData, stressData, [], [], options);
lambda_fitted = params(1);
mu_fitted = params(2);

第6章:有限应变

  1. 基于特定理论(如TL和UL公式)的有限应变分析相关代码片段(示例)
    • 计算变形梯度(以平面应变条件下的弯曲和牵引荷载为例,在主程序中可能的计算方式,与第5章类似但可能涉及不同的处理或计算顺序)

第6章:有限应变(续)

  1. 基于特定理论(如TL和UL公式)的有限应变分析相关代码片段(示例)
    • 计算变形梯度(以平面应变条件下的弯曲和牵引荷载为例,在主程序中可能的计算方式,与第5章类似但可能涉及不同的处理或计算顺序)
% 假设已经定义了节点坐标node和位移向量U
for i = 1:length(node)
    x(i) = node(i, 1) + U(2 * i - 1);
    y(i) = node(i, 2) + U(2 * i);
end
% 计算变形梯度F
for i = 1:length(element)
    node1 = element(i, 1);
    node2 = element(i, 2);
    dx_dX = (x(node2) - x(node1)) / (node(node2, 1) - node(node1, 1));
    dy_dX = (y(node2) - y(node1)) / (node(node2, 1) - node(node1, 1));
    dx_dY = 0; % 平面应变假设
    dy_dY = 1; % 平面应变假设
    F(i, :, :) = [dx_dX dx_dY; dy_dX dy_dY];
end
  • 计算拉格朗日应变(基于TL公式,使用上述计算的变形梯度F)
E_TL = zeros(length(element), 3);
for i = 1:length(element)
    F_i = F(i, :, :);
    E_TL(i, 1) = 0.5 * (F_i(1, 1)^2 + F_i(2, 1)^2 - 1); % E_xx
    E_TL(i, 2) = 0.5 * (F_i(1, 2)^2 + F_i(2, 2)^2 - 1); % E_yy
    E_TL(i, 3) = F_i(1, 1) * F_i(1, 2) + F_i(2, 1) * F_i(2, 2); % E_xy
end
  • 计算拉格朗日应力(假设材料参数已定义,如弹性模量E和泊松比nu,以平面应力为例,使用TL公式计算变形梯度F)
C = E / (1 - nu^2) * [1 nu 0; nu 1 0; 0 0 (1 - nu) / 2]; % 平面应力本构矩阵
S_TL = zeros(length(element), 3);
for i = 1:length(element)
    E_i = [E_TL(i, 1); E_TL(i, 2); E_TL(i, 3)];
    S_TL(i, :) = C * E_i;
end
  • 计算更新的拉格朗日(UL)公式相关量(如UL应变和应力,假设在计算变形梯度F后进行)
% 计算UL变形梯度F_UL(假设已经有了F)
F_UL = zeros(size(F));
for i = 1:length(element)
    F_UL(i, :, :) = inv(F(i, :, :))' * F(i, :, :);
end
% 计算UL应变E_UL
E_UL = zeros(length(element), 3);
for i = 1:length(element)
    F_UL_i = F_UL(i, :, :);
    E_UL(i, 1) = 0.5 * (F_UL_i(1, 1)^2 + F_UL_i(2, 1)^2 - 1); % E_xx
    E_UL(i, 2) = 0.5 * (F_UL_i(1, 2)^2 + F_UL_i(2, 2)^2 - 1); % E_yy
    E_UL(i, 3) = F_UL_i(1, 1) * F_UL_i(1, 2) + F_UL_i(2, 1) * F_UL_i(2, 2); % E_xy
end
% 计算UL应力S_UL(假设材料参数不变)
S_UL = zeros(length(element), 3);
for i = 1:length(element)
    E_UL_i = [E_UL(i,

### 第7章:线性方程组和特征问题的求解
1. **线性方程组求解相关函数**
   - `mldivide`函数:这是MATLAB中用于求解线性方程组`Ax = B`的内置函数,其用法为`x = A\B`,其中`A`是系数矩阵,`B`是右端项向量,`x`是解向量。例如,对于方程组`A = [1 2; 3 4]; B = [5; 6]; x = A\B`,将计算出满足`Ax = B`的`x`值。
   - `qr`函数:用于对矩阵进行QR分解,语法为`[Q, R] = qr(A)`,其中`A`是待分解的矩阵,`Q`是正交矩阵,`R`是上三角矩阵。例如,`A = [1 2 3; 4 5 6; 7 8 9]; [Q, R] = qr(A)`将对矩阵`A`进行QR分解并返回`Q`和`R`。
   - `lu`函数:执行LU分解,语法为`[L, U, P] = lu(A)`,`A`是输入矩阵,`L`是下三角矩阵(主对角线元素为1),`U`是上三角矩阵,`P`是置换矩阵。例如,`A = [2 1; 4 3]; [L, U, P] = lu(A)`将得到矩阵`A`的LU分解结果。
   - `chol`函数:进行Cholesky分解,语法为`R = chol(A)`,其中`A`必须是对称正定矩阵,`R`是上三角矩阵,满足`A = R'*R`。例如,`A = [4 2; 2 2]; R = chol(A)`将计算矩阵`A`的Cholesky分解。
2. **特征问题求解相关函数**
   - `eig`函数:用于计算矩阵的特征值和特征向量,语法为`[V, D] = eig(A)`,其中`A`是输入矩阵,`V`是特征向量矩阵,`D`是对角矩阵,其对角元素是特征值。例如,`A = [1 2; 3 4]; [V, D] = eig(A)`将返回矩阵`A`的特征值和特征向量。
   - `jacobi`方法相关函数(假设自行编写的`jacobi`函数实现雅可比方法)
```matlab
function [V, D] = jacobi(A, tol)
    % 初始化特征向量矩阵为单位矩阵
    V = eye(size(A));
    % 计算矩阵的对角元素
    D = diag(diag(A));
    % 计算非对角元素的平方和
    off = sum(sum(A.^2)) - sum(diag(A).^2);
    % 迭代直到收敛
    while off > tol
        % 找到最大非对角元素的位置
        [p, q] = find(abs(A - D) == max(max(abs(A - D))));
        p = p(1);
        q = q(1);
        % 计算旋转角度
        if A(p, q) ~= 0
            theta = 0.5 * atan(2 * A(p, q) / (D(q, q) - D(p, p)));
        else
            theta = 0;
        end
        % 计算旋转矩阵
        c = cos(theta);
        s = sin(theta);
        J = [c s; -s c];
        % 更新矩阵A和特征向量矩阵V
        A([p, q], :) = J' * A([p, q], :);
        A(:, [p, q]) = A(:, [p, q]) * J;
        V(:, [p, q]) = V(:, [p, q]) * J;
        % 更新对角矩阵D
        D([p, q], [p, q]) = J' * D([p, q], [p, q]) * J;
        % 更新非对角元素的平方和
        off = sum(sum(A.^2)) - sum(diag(A).^2);
    end
end
  • generalized jacobi方法相关函数(假设自行编写的generalized_jacobi函数实现广义雅可比方法,此处仅为示意,实际函数可能更复杂)
function [V, D] = generalized_jacobi(A, B, tol
posted @ 2024-11-17 21:47  redufa  阅读(65)  评论(0)    收藏  举报