1 % 光学参数关系计算与可视化
% 参数设置
theta = deg2rad(12 ); % 将角度转换为弧度
psi = deg2rad(38.24 );
K = 4.886;
R_values = 0:0.1:1.5; % 定义R的取值及步长,修改为0-1.5
num_points = length(R_values);
% 预分配存储结果的数组
P_values = zeros(1, num_points);
C_values = zeros(1, num_points);
gamma1_values = zeros(1, num_points);
gamma2_values = zeros(1, num_points);
gamma_min_values = zeros(1, num_points);
% 迭代计算P、C、gamma1、gamma2、gamma_min
for i = 1:num_points
R = R_values(i);
% 计算P(公式3)
term1_numerator_P = (1 + cos(theta)) / (2 * sin(psi/2)^2);
term2_numerator_P = sin(theta) / tan(psi/2);
numerator_P = K^2 - (term1_numerator_P - term2_numerator_P - cos(theta)) * R^2;
term1_denominator_P = (1 - cos(theta)) / (2 * sin(psi/2)^2);
term2_denominator_P = sin(theta) / tan(psi/2);
denominator_P = term1_denominator_P + term2_denominator_P + cos(theta);
% 检查P的计算是否有效
if numerator_P < 0
warning('R = %.1f 时,P的计算结果为复数,使用NaN替代', R);
P = NaN;
else
P = sqrt(numerator_P / denominator_P);
end
P_values(i) = P;
% 计算C(公式4)
if ~isnan(P)
term1_C = P^2 * (1 - cos(theta));
term2_C = R^2 * (1 + cos(theta));
C = sqrt((term1_C + term2_C) / (2 * sin(psi/2)^2));
else
C = NaN;
end
C_values(i) = C;
% 计算gamma1(修正公式)
if ~isnan(P) && ~isnan(C)
numerator_gamma1 = P^2 + C^2 - (K - R)^2;
denominator_gamma1 = 2 * P * C;
% 检查gamma1的计算是否有效
if abs(numerator_gamma1 / denominator_gamma1) <= 1
gamma1_rad = acos(numerator_gamma1 / denominator_gamma1);
else
warning('R = %.1f 时,gamma1的计算结果无效,使用NaN替代', R);
gamma1_rad = NaN;
end
else
gamma1_rad = NaN;
end
gamma1_values(i) = rad2deg(gamma1_rad);
% 计算gamma2(公式6和7)
if ~isnan(P) && ~isnan(C)
numerator_gamma2 = P^2 + C^2 - (K + R)^2;
denominator_gamma2 = 2 * P * C;
% 检查gamma2的计算是否有效
if abs(numerator_gamma2 / denominator_gamma2) <= 1
gamma2_rad = acos(numerator_gamma2 / denominator_gamma2);
% 根据条件判断gamma2的值
if gamma2_rad > pi/2 % 90°转换为弧度
gamma2_rad = pi - gamma2_rad; % 使用180°修正
end
else
warning('R = %.1f 时,gamma2的计算结果无效,使用NaN替代', R);
gamma2_rad = NaN;
end
else
gamma2_rad = NaN;
end
gamma2_values(i) = rad2deg(gamma2_rad);
% 计算gamma_min(公式8)
gamma_min_values(i) = min(gamma1_values(i), gamma2_values(i));
end
% 创建数据表格
data = [R_values', P_values', C_values', gamma1_values', gamma2_values', gamma_min_values'];
columnNames = {'R', 'P', 'C', '\gamma_1(°)', '\gamma_2(°)', '\gamma_{\text{min}}(°)'};
% 创建主图形窗口
fig = uifigure('Position', [100, 100, 1000, 600], 'Name', 'R-P-C-\gamma 关系分析');
% 创建参数信息文本
param_info = uicontrol(fig, 'Style', 'text', ...
'String', sprintf('参数设置: θ=%.2f°, ψ=%.2f°, K=%.2f, R范围=0-1.5', rad2deg(theta), rad2deg(psi), K), ...
'Position', [10, 560, 980, 30], ...
'FontSize', 12, ...
'HorizontalAlignment', 'center');
% 创建表格
uitable(fig, 'Data', data, 'ColumnName', columnNames, ...
'Position', [10, 300, 980, 250], 'FontSize', 10);
% 创建P和C随R变化曲线
ax1 = uiaxes(fig, 'Position', [10, 160, 480, 120]);
plot(ax1, R_values, P_values, 'b-o', 'LineWidth', 1.5, 'DisplayName', 'P');
hold(ax1, 'on');
plot(ax1, R_values, C_values, 'r-o', 'LineWidth', 1.5, 'DisplayName', 'C');
title(ax1, 'P和C随R变化曲线');
xlabel(ax1, 'R');
ylabel(ax1, '值');
grid(ax1, 'on');
legend(ax1, 'show', 'Location', 'best');
% 创建gamma值随R变化曲线
ax2 = uiaxes(fig, 'Position', [510, 160, 480, 120]);
plot(ax2, R_values, gamma1_values, 'b-o', 'LineWidth', 1.5, 'DisplayName', '\gamma_1');
hold(ax2, 'on');
plot(ax2, R_values, gamma2_values, 'r-o', 'LineWidth', 1.5, 'DisplayName', '\gamma_2');
plot(ax2, R_values, gamma_min_values, 'g-o', 'LineWidth', 1.5, 'DisplayName', '\gamma_{\text{min}}');
title(ax2, '\gamma 值随R变化曲线');
xlabel(ax2, 'R');
ylabel(ax2, '角度 (°)');
grid(ax2, 'on');
legend(ax2, 'show', 'Location', 'best');