小淼博客

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、一维离散数据微分、积分求解

1. 离散积分

function result = integral(x,y,c)
    result = [];
    for i=1:1:length(y)
        c=y(i)*(x(2)-x(1))+c ; 
        result(end+1) = c;
    end
end

2. 离散微分

function result = differential(x,y)
    h = x(2)-x(1);
    result = [];
    for i=1:1:length(y)
        if i <= length(y)/2
            result(end+1) = (y(i+1)-y(i))/h;
        else
            result(end+1) = (y(i)-y(i-1))/h;
        end
    end
end

3. 测试代码

x = 0:0.001:2;
y = x;
y1 = integral(x,y,1);
plot(x,y);hold on
plot(x,y1);
figure;
y2 = differential(x,y1)
plot(x,y1);hold on
plot(x,y2)

Reference

  1. matlab离散数据微积分

二、空间几何计算

1. 计算点到直线的距离

function d = distanceToLine3D(P, P1, P2)
    % P: 点 [x0, y0, z0]
    % P1: 直线上的点1 [x1, y1, z1]
    % P2: 直线上的点2 [x2, y2, z2]
    
    % 计算向量 v 和 d
    v = [P(1) - P1(1), P(2) - P1(2), P(3) - P1(3)];
    d = [P2(1) - P1(1), P2(2) - P1(2), P2(3) - P1(3)];
    
    % 计算投影长度 p 的分子部分
    numerator = dot(v, d);
    denominator = norm(d)^2;
    
    % 计算投影长度 p 的绝对值(如果需要非负值)
    p = max(0, min(numerator / denominator, 1)) * norm(d); % 限制在 [0, 1] 内
    
    % 计算距离 d(P, L)
    d = norm(v) - p;
end

最优化过程

% 矩形优化问题:最小化对角线长度,满足周长和面积约束
clear; clc;

% 1. 定义目标函数(最小化对角线长度)
% x = [a; b],a为长,b为宽
obj_fun = @(x) sqrt(x(1)^2 + x(2)^2);

% 2. 定义约束条件
% 线性不等式约束:A*x ≤ b
% a + b ≤ 10(周长约束:2(a+b) ≤ 20)
A = [1 1];
b = 10;

% 非线性不等式约束:c(x) ≤ 0(需转化为 ≤ 0 形式)
% 面积约束:a*b ≥ 15 → 15 - a*b ≤ 0
nonlin_con = @(x) 15 - x(1)*x(2);

% 边界约束:x ≥ lb(a>0, b>0,用一个极小值近似)
lb = [1e-6; 1e-6];  % 避免为0
ub = [];  % 无上限

% 3. 初始点(任意合理值)
x0 = [3; 5];  % 初始猜测值

% 4. 选择优化方法并求解
% 有约束问题用fmincon,指定算法(如'sqp'适合非线性约束)
options = optimoptions('fmincon', ...
    'Algorithm', 'sqp', ...  % 序列二次规划法,适合非线性约束
    'Display', 'iter', ...   % 显示迭代过程
    'MaxFunctionEvaluations', 1e4);

[x_opt, f_opt] = fmincon(obj_fun, x0, A, b, [], [], lb, ub, nonlin_con, options);

% 5. 输出结果
fprintf('优化结果:\n');
fprintf('长 a = %.4f, 宽 b = %.4f\n', x_opt(1), x_opt(2));
fprintf('最小对角线长度 = %.4f\n', f_opt);
fprintf('验证约束:周长 = %.4f, 面积 = %.4f\n', ...
    2*(x_opt(1)+x_opt(2)), x_opt(1)*x_opt(2));
posted on 2025-09-27 21:50  小淼博客  阅读(13)  评论(0)    收藏  举报

大家转载请注明出处!谢谢! 在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~