%定义原始曲线
x_func =@(t)t;
y_func =@(t)t.^3+t;
%定于参数范围和采点的数量
num_point = 10;
t_values = linspace(0,1,num_point); %x在【0,1】
%计算采样点的坐标
x_samples = x_func(t_values);
y_samples = y_func(t_values);
%计算采样点的切线向量和法向量(一阶导)
dx_dt = gradient(x_samples)./gradient(t_values);
dy_dt = gradient(y_samples)./gradient(t_values);
tangent_vectors = [dx_dt;dy_dt];
%计算采样点的数据(二阶导)
dx2_dt2 =gradient(dx_dt)./gradient(t_values);
dy2_dt2 =gradient(dy_dt)./gradient(t_values);
%求曲率
curvatures =abs(dx_dt.*dy2_dt2 - dy_dt.*dx2_dt2)./(dx_dt.^2+dy_dt.^2).^(3/2);
k =curvatures;
x_values = x_samples;
%生成10个随机数(值得优化)
random_numbers = -3+6*rand(1,10);
y_initial =random_numbers;
%拟合的多项式次数
dgree = 3;
%使用polyfit函数进行多项式拟合
coeffs = polyfit(x_values,y_initial,dgree);
%使用拟合参数来预测拟合曲线上的点
x_fit = linspace(min(x_values),max(x_values),100); %生成密集的横坐标
y_fit_initial = polyval(coeffs,x_fit);
%绘制原始数据和拟合曲线
figure;
plot(x_values,y_initial,'o',x_fit,y_fit_initial,'-','LineWidth',1.5);
hold on;
%绘制原始曲线
x_original=linspace(0,1,100);
y_original = x_original.^3+x_original;
plot(x_original,y_original,'m--','LineWidth',1.5);
legend('原始数据','最初的拟合曲线','原始曲线');
title('最初的拟合曲线和原始曲线');
%定义多项式函数
poly_func = @(x)ployval(coeffs,x);
%定义二阶导数函数
poly_second_derivative = @(x) 2*coeffs(1) +6*coeffs(2)*x+12*coeffs(3)*x.^2;
%计算最初的曲率
curvature_valuea_initial =abs(poly_second_derivative(x_values))./(1+polyval(coeffs,x_values).^2).^(3/2);
%定义目标函数,是的每个曲率都无限接近给定的曲率
percentage_threshold=0.01;
objective_func = @(coeffs) sum(abs(curvature_valuea_initial - abs(poly_second_derivative(x_values))./(1+polyval(coeffs,x_values).^2).^(3/2))) < percentage_threshold;
%设置初始值
initial_guess = y_initial;
options=optimoptions('fmincon','MaxFunctionEvaluations',1000,'MaxIterations',1000);
%设置y值的约束范围
lb = -3*ones(size(initial_guess));
ub=3*ones(size(initial_guess));
%添加条件当x=0时候,y=0
x_zero_constarint =@(y) y(1);
A_eg =zeros(1,length(initial_guess));
A_eg(1)=1;
b_eq = 0;
%进行多次优化
num_optimizations =1000;
best_optimized_result=[];
best_optimized_score = Inf;
for i = 1:num_optimizations
%初始值
initial_guess =-5 +10*rand(1,10);
%进行优化
[y_optimized,fval,exitflag]=fmincon(objective_func,initial_guess,[],[],A_eg,b_eq,lb,ub,[],[]);
%计算得分
score = fval;
if score<best_optimized_score
best_optimized_result=y_optimized;
best_optimized_score=score;
end
end
%输出最佳结果
disp("最佳优化结果:");
disp(best_optimized_result);
%使用最佳优化结果重新拟合多项式
coeffs_best =polyfit(x_values,best_optimized_result,degree);
%使用拟合参数来预测拟合曲线上的点
y_fit_best = polyval(coeffs_best,x_fit);
%绘制原始数据和曲线
figure;
polt(x_values,best_optimized_result,'o',x_fit,y_fit_best,'-','LineWidth',1.5);
hold on;
%绘制原始曲线
plot(x_original,y_original,'m--','LineWidth',1.5);
legend('原始数据','最初的拟合曲线','原始曲线');
title('最初的拟合曲线和原始曲线');
报错在fmincon那一行
该如何修改正确