请教一下大家,关于直线和曲线交点的问题,这个程序哪里出错了呢,怎么修改?
Ny=200;%输入光线取样数量
Y=[];
Z=[];
for i=1:Ny
beta=70;
v(i)=beta*(i/Ny);
k(i)=tand(v(i));
% 定义直线和曲线的函数
line12_func = @(x12) k(i)*x12;
curve12_func = @(x12) - 1.206e-06*(x12-4)^3 + 0.01432*(x12-4)^2 - 0.001057*(x12-4) - 17.46;
% 将两个函数相减,得到它们的交点
func12 = @(x12) line12_func(x12) - curve12_func(x12);
% 使用 fzero 求解交点
x0 = [39,209.094981273047]; % 从x=39开始搜索交点
x12_intersect = fzero(func12, x0);
% 输出交点的坐标
y12_intersect = line12_func(x12_intersect);
Y=[Y,x12_intersect];
Z=[Z,y12_intersect];
plot(x12_intersect, y12_intersect,'*')
hold on
end
hold on
该回答引用ChatGPT
这个程序中的问题是,每次循环迭代时,直线和曲线的函数都是一样的,只有函数的参数不同,因为它们依赖于循环变量 i。然而,由于使用 fzero 求解交点的过程是迭代过程,因此在每次迭代时都重新定义直线和曲线的函数会导致迭代过程不收敛或者收敛非常慢。
为了解决这个问题,可以将直线和曲线的函数定义移到循环之外,然后在循环内仅仅更新函数的参数即可,如下所示:
Ny=200; % 输入光线取样数量
Y=[];
Z=[];
beta=70;
k_func = @(v) tand(v);
line12_func = @(k, x12) k*x12;
curve12_func = @(x12) - 1.206e-06*(x12-4)^3 + 0.01432*(x12-4)^2 - 0.001057*(x12-4) - 17.46;
func12 = @(k, x12) line12_func(k, x12) - curve12_func(x12);
for i=1:Ny
v=beta*(i/Ny);
k=k_func(v);
% 使用 fzero 求解交点
x0 = [39,209.094981273047]; % 从x=39开始搜索交点
x12_intersect = fzero(@(x12) func12(k, x12), x0);
% 输出交点的坐标
y12_intersect = line12_func(k, x12_intersect);
Y=[Y,x12_intersect];
Z=[Z,y12_intersect];
plot(x12_intersect, y12_intersect,'*')
hold on
end
hold on
在修改后的程序中,直线和曲线的函数被定义成匿名函数,它们的参数分别为 k 和 x12,x12 是自变量。在每次循环迭代时,仅更新函数的参数 k,然后将更新后的函数传递给 fzero 进行迭代求解。这样,迭代过程就不会被重新定义函数所干扰,收敛速度会更快。
运行后有什么问题吗