自定义显示位数 %02d %.2f

格式化输出日期与浮点数
本文介绍如何使用格式化字符串将int型日期转换为2位数显示形式,例如:2010年09月05日,并展示如何将float型变量输出为保留两位小数的形式。

int型 用@"%d年%02d月%02d日",2010,9,5  输出可以转成2位数,结果为:2010年09月05日.

float型 可以用%.2f 输出得到小数点后2位的结果输出.  

转载于:https://www.cnblogs.com/gushuo/archive/2010/11/18/1881052.html

% 单因素方差分析:温度对化工产品收率的影响 % 数据:5种温度条件下,每种温度4次重复实验 data = [55.0, 58.0, 57.4, 57.1; % 温度1 54.4, 56.8, 52.4, 56.0; % 温度2 54.0, 54.1, 54.3, 54.0; % 温度3 56.4, 57.0, 56.6, 57.0; % 温度4 56.1, 57.0, 56.1, 54.0]; % 温度5 group_names = {'Temp1', 'Temp2', 'Temp3', 'Temp4', 'Temp5'}; alpha = 0.05; % 显著性水平 % 创建图形窗口 figure('Position', [100, 100, 1200, 800], 'Name', '化工产品收率分析', 'Color', 'w'); %% 改进的正态性检验 % 方案1: Shapiro-Wilk检验 (更适用于小样本) shapiro_p = zeros(1,5); for i = 1:5 shapiro_p(i) = swtest(data(i,:)); % 需要自定义swtest函数 end % 方案2: Anderson-Darling检验 (MATLAB内置) ad_p = zeros(1,5); for i = 1:5 [~, ad_p(i)] = adtest(data(i,:)); end % Q-Q图可视化 subplot(2,3,1); hold on; colors = lines(5); for i = 1:5 qqplot(data(i,:)); h = get(gca, 'children'); set(h, 'MarkerEdgeColor', colors(i,:), 'Marker', 'o') end title('Q-Q图检验正态性'); xlabel('标准正态分位数'); ylabel('数据分位数'); legend(group_names, 'Location', 'best'); grid on; %% 改进的方差齐性检验 % Bartlett检验 (参数方法) [~, p_bartlett] = vartestn(data', 'TestType','Bartlett', 'Display','off'); % Levene检验 (非参数方法) [~, p_levene] = vartestn(data', 'TestType','LeveneAbsolute', 'Display','off'); %% 选择统计方法 normality_ok = all(ad_p > alpha/2); % Bonferroni校正 variance_ok = (p_levene > alpha); if normality_ok && variance_ok % 参数方法:单因素方差分析 [p_anova, tbl, stats] = anova1(data', group_names, 'off'); % 方差分析表输出 disp('=== 方差分析结果 ==='); fprintf('F(%d, %d) = %.2f, p = %.4f\n\n', ... tbl{2,3}, tbl{3,3}, tbl{2,5}, p_anova); % 可视化 % ... [保持您的可视化代码] ... if p_anova < alpha % Tukey HSD多重比较 [c] = multcompare(stats, 'CType', 'tukey-kramer', 'Display','off'); % 创建比较结果表 compTable = array2table(c, 'VariableNames', ... {'GroupA','GroupB','LowerCI','Difference','UpperCI','PValue'}); compTable.GroupA = categorical(compTable.GroupA, 1:5, group_names); compTable.GroupB = categorical(compTable.GroupB, 1:5, group_names); disp('=== 多重比较结果 (Tukey HSD) ==='); disp(compTable); end else % 非参数方法:Kruskal-Wallis检验 [p_kruskal, tbl_kw] = kruskalwallis(data', group_names, 'off'); disp('=== Kruskal-Wallis检验 ==='); fprintf('χ&sup2;(%d) = %.2f, p = %.4f\n', ... tbl_kw{2,3}, tbl_kw{2,5}, p_kruskal); if p_kruskal < alpha % Dunn's post-hoc检验 pvals = dunns_test(data, group_names); % 需要自定义函数 end end %% 添加统计结论 annotation('textbox', [0.1, 0.01, 0.8, 0.08], 'String', ... sprintf(['正态性(Anderson-Darling): %s (min-p=%.3f)\\n' ... '方差齐性(Levene): %s (p=%.3f)\\n' ... '使用方法: %s'], ... ternary(normality_ok, '满足', '不满足'), min(ad_p), ... ternary(variance_ok, '满足', '不满足'), p_levene, ... ternary(normality_ok && variance_ok, 'ANOVA', 'Kruskal-Wallis')), ... 'FitBoxToText', 'on', 'BackgroundColor', 'w', 'EdgeColor', 'k', ... 'FontSize', 10); %% 辅助函数 function result = ternary(condition, true_str, false_str) if condition result = true_str; else result = false_str; end end % Shapiro-Wilk检验实现 function [p] = swtest(x) % 排序数据 x = sort(x); n = length(x); % Shapiro-Wilk系数 (n=4) a = [0.6872; 0.1677]; % 标准系数 % 计算W统计量 numerator = sum(a.*(x(end:-1:end-length(a)+1) - x(1:length(a)))'; W = (numerator^2) / sum((x - mean(x)).^2); % 计算p值 (使用近似方法) mu = 0.940; sigma = 0.024; z = (W - mu)/sigma; p = 1 - normcdf(z); end >> q1 文件: q1.m 行: 122 列: 69 无效表达式。调用函数或对变量进行索引时,请使用圆括号。否则,请检查不匹配的分隔符。
最新发布
07-29
%% 修复后的机械臂轨迹规划系统 clear; clc; close all; % =========================================== % 改进的逆解选择函数 % =========================================== function selected = select_solution(solutions, reference, joint_limits) % 参数: % solutions: N×6矩阵,所有可能的逆解 % reference: 1×6向量,参考关节角度 % joint_limits: 6×2矩阵,关节角度限位 if isempty(solutions) error('逆运动学无解!'); end % 步骤1: 筛选满足关节限位的解 valid_mask = true(size(solutions, 1), 1); for i = 1:size(solutions, 1) for j = 1:6 if solutions(i, j) < joint_limits(j, 1) || solutions(i, j) > joint_limits(j, 2) valid_mask(i) = false; break; end end end valid_solutions = solutions(valid_mask, :); % 如果没有满足限位的解,则使用所有解 if isempty(valid_solutions) warning('所有逆解均超出关节限位,使用最佳近似解'); valid_solutions = solutions; end % 步骤2: 计算各解与参考位置的关节位移 displacements = zeros(size(valid_solutions, 1), 1); for i = 1:size(valid_solutions, 1) displacements(i) = norm(valid_solutions(i, :) - reference); end % 步骤3: 避免奇异构型 (关节5接近0) singularity_penalty = ones(size(valid_solutions, 1), 1); for i = 1:size(valid_solutions, 1) if abs(valid_solutions(i, 5)) < deg2rad(5) % 关节5小于5度 singularity_penalty(i) = 10; % 增加惩罚因子 end end % 步骤4: 选择综合最优解 [~, idx] = min(displacements .* singularity_penalty); selected = valid_solutions(idx, :); % 步骤5: 检查最终选择 for j = 1:6 if selected(j) < joint_limits(j, 1) || selected(j) > joint_limits(j, 2) warning('选择的解超出关节%d限位: %.2f° (限位 %.2f°-%.2f°)', ... j, rad2deg(selected(j)), ... rad2deg(joint_limits(j, 1)), rad2deg(joint_limits(j, 2))); end end end % =========================================== % 主程序修改部分 % =========================================== % 机械臂参数 (Modified D-H) a = [0, 0, 500, 500, 0, 0]; % 连杆长度(mm) alpha = [0, -pi/2, 0, -pi/2, pi/2, -pi/2]; % 连杆扭角(rad) d = [400, 0, 0, 0, 0, 100]; % 连杆偏移(mm) joint_limits = [ -pi, pi; % 关节1 -pi/2, pi/2; % 关节2 -pi/2, pi/2; % 关节3 -pi, pi; % 关节4 0, pi; % 关节5 -pi, pi % 关节6 ]; % 选择工作空间中的两点 P_start = [600; 200; 500]; P_goal = [300; -300; 600]; R = [1 0 0; 0 -1 0; 0 0 -1]; % 旋转矩阵(末端垂直向下) T_start = [R, P_start; 0 0 0 1]; T_goal = [R, P_goal; 0 0 0 1]; % 自定义逆运动学求解 q_start_sols = inverse_kinematics(T_start, a, alpha, d, joint_limits); q_goal_sols = inverse_kinematics(T_goal, a, alpha, d, joint_limits); % 使用改进的选择函数 current_position = [0, 0, 0, 0, pi/2, 0]; % 假设初始位置 q_start = select_solution(q_start_sols, current_position, joint_limits); q_goal = select_solution(q_goal_sols, q_start, joint_limits); % 显示选择结果 fprintf('选择的初始关节角度: [%.2f°, %.2f°, %.2f°, %.2f°, %.2f°, %.2f°]\n', rad2deg(q_start)); fprintf('选择的终止关节角度: [%.2f°, %.2f°, %.2f°, %.2f°, %.2f°, %.2f°]\n', rad2deg(q_goal)); % =========================================== % 增强的逆运动学函数 % =========================================== function solutions = inverse_kinematics(T, a, alpha, d, joint_limits) % 末端位置 P = T(1:3, 4); x = P(1); y = P(2); z = P(3); % 末端姿态 R = T(1:3, 1:3); solutions = []; % 关节1求解 (2个可能解) theta1_options = [atan2(y, x), atan2(-y, -x)]; % 关节3参数计算 c3 = (x^2 + y^2 + (z - d(1))^2 - a(2)^2 - a(3)^2 - d(4)^2) / (2 * a(2) * a(3)); % 检查可达性 if abs(c3) > 1 return; % 点不可达 end s3_options = [sqrt(1 - c3^2), -sqrt(1 - c3^2)]; for theta1 = theta1_options for s3 = s3_options theta3 = atan2(s3, c3); % 关节2求解 A = a(2) + a(3)*c3; B = a(3)*s3; k1 = A*cos(theta1) + B*sin(theta1); k2 = A*sin(theta1) - B*cos(theta1); k3 = z - d(1); % 解三角函数方程 denom = k1^2 + k2^2; if abs(denom) < 1e-6 continue; % 避免除零 end sin_theta2 = (k1*k3 + k2*sqrt(denom - k3^2)) / denom; cos_theta2 = (k1 - k2*sin_theta2) / k1; theta2 = atan2(sin_theta2, cos_theta2); % 计算T03变换 T01 = dh_transform(a(1), alpha(1), d(1), theta1); T12 = dh_transform(a(2), alpha(2), d(2), theta2); T23 = dh_transform(a(3), alpha(3), d(3), theta3); T03 = T01 * T12 * T23; % 计算腕部旋转R36 R03 = T03(1:3, 1:3); R36 = R03' * R; % ZYZ欧拉角分解 (2组解) [theta4, theta5, theta6] = zyz_euler(R36); % 保存所有有效解 for k = 1:2 sol = [theta1, theta2, theta3, theta4(k), theta5(k), theta6(k)]; % 简单限位检查 valid = true; for j = 1:6 if sol(j) < joint_limits(j, 1) || sol(j) > joint_limits(j, 2) valid = false; break; end end if valid solutions = [solutions; sol]; end end end end % 如果没有找到解,尝试数值优化 if isempty(solutions) fprintf('解析法无解,尝试数值优化...\n'); options = optimoptions('fmincon', 'Display', 'off', ... 'Algorithm', 'sqp'); q0 = mean(joint_limits, 2)'; % 关节限位中值作为初始猜测 % 定义优化目标函数 objective = @(q) norm(forward_kinematics(q, a, alpha, d) - T, 'fro'); % 定义约束函数 constraint = @(q) deal([], ... [q - joint_limits(:, 1); % 下限约束 joint_limits(:, 2) - q]); % 上限约束 % 执行优化 [q_opt, ~, exitflag] = fmincon(objective, q0, [], [], [], [], ... joint_limits(:, 1), joint_limits(:, 2), ... constraint, options); if exitflag > 0 solutions = [solutions; q_opt]; end end end % =========================================== % 辅助函数 % =========================================== % 单个D-H变换 function T = dh_transform(a, alpha, d, theta) ct = cos(theta); st = sin(theta); ca = cos(alpha); sa = sin(alpha); T = [ct, -st*ca, st*sa, a*ct; st, ct*ca, -ct*sa, a*st; 0, sa, ca, d; 0, 0, 0, 1]; end % 完整正运动学 function T = forward_kinematics(q, a, alpha, d) T = eye(4); for i = 1:length(q) T = T * dh_transform(a(i), alpha(i), d(i), q(i)); end end % ZYZ欧拉角分解 (改进版) function [theta4, theta5, theta6] = zyz_euler(R) % 处理数值精度问题 R = round(R, 10); % 求解theta5 theta5 = atan2(sqrt(R(1,3)^2 + R(2,3)^2), R(3,3)); % 两种分支解 theta5_alt = -theta5; % 求解theta4和theta6 if abs(theta5) > 1e-6 theta4 = atan2(R(2,3)/sin(theta5), R(1,3)/sin(theta5)); theta6 = atan2(R(3,2)/sin(theta5), -R(3,1)/sin(theta5)); theta4_alt = atan2(R(2,3)/sin(theta5_alt), R(1,3)/sin(theta5_alt)); theta6_alt = atan2(R(3,2)/sin(theta5_alt), -R(3,1)/sin(theta5_alt)); else % 奇异位置处理 theta4 = 0; theta6 = atan2(-R(2,1), R(1,1)); theta4_alt = theta4; theta6_alt = theta6; end % 返回两组解 theta4 = [theta4, theta4_alt]; theta5 = [theta5, theta5_alt]; theta6 = [theta6, theta6_alt]; end % 轨迹规划函数 (与之前相同) % ... [保持不变] ... % 绘图函数 (与之前相同) % ... [保持不变] ...
06-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值