创建一个函数处理函数处理的总和

6视图(30天)
Goodmorning每个人,
我有以下几点
点= [0.0194358127458200 0.0125146090698240 0.0120324235527160 0.00761174198214000 0.00660775699279100 0.00381485098617300 0.00195617023840500 0.000824508358196000 0.00121681256884900 0.000390389885216000 0.000444315057222000 0;
0 0.000452782917043000 0.000395689955442000 0.00121172812659200 0.000829869449880000 0.00195546440425700 0.00381482017361200 0.00661064156533300 0.00762496776011900 0.0120411026638820 0.0125098828784870 0.0189137987850580);
我需要创建一个函数处理如下。
我知道周长的中心接近更好的这些点是R的函数,和在点(R, R)。然后近似误差:
错误= @ (R) abs(规范([R-POINTS(我),R-POINTS(我)])- R));
这对于每一个点。
我想创建这个函数处理,是所有的错误的总和:
1)totdist = @ (R) error1 + error2 + error3 +
我可以手动创建一个函数函数总结每一个错误:
2)totdist = @ (R) abs(规范([R-POINTS (1, 1), R-POINTS (2, 1))) - R)) + abs(规范([R-POINTS (1、2), R-POINTS (2, 2))) - R)) + abs(规范([R-POINTS (1,3), R-POINTS (2、3)]) - R)) +
然而当点的数量大,我想手动创建求和函数1)authomatically没有总结2)的100倍。
函数必须使用“fminsearch”之后。
有办法实现吗?
提前感谢你的答案。
1评论
Bjorn Gustavsson
Bjorn Gustavsson 2023年1月14日
@Riccardo玛丽 :至少试图通过建议看看他们做什么工作。使用简单的测试用例。

登录置评。

答案(3)

Bjorn Gustavsson
Bjorn Gustavsson 2023年1月13日
您的规范对我有点模糊,但是如果我解释它,这样你想适应这样一个函数:
(我使用的附加条件 ,但是这个很容易放松)。你可以做一个通用的解决方案是这样的:
f_x = @ (R,θ,f_theta) R + f_theta (R,θ)。* cos(θ);
f_y = @ (R,θ,f_theta) R + f_theta (R,θ)。*罪(θ);
err_fcn = @ (R, X, Y, f_theta)和((X-f_x (R,量化(Y R, X R), f_theta))。^ 2 + (Y-f_y (R,量化(y R, x R), f_theta)) ^ 2);
f_theta = @ R (R,θ)*的(大小(θ));
休息= fminsearch (@ (R) err_fcn (R,点(1:),点(2:),f_theta), 20 e - 3);
这是一个相当麻烦的方式做出简单circle-fitting-function,您将发现多个circle-fitting-functions文件交换: circle-fitting FEx贡献 。如果你的周长是更复杂,更复杂的比一个椭圆,然后你只需要修改 f_theta 相应地function-handle。如果圆周的中心不是一模一样的半径例如然后你必须修改上述代码片段:
f_x = @ (R,θ,f_theta) R (1) + f_theta (R(3),θ)。* cos(θ);
f_y = @ R (R,θ,f_theta) (2) + f_theta (R(3),θ)。*罪(θ);
err_fcn = @ (R, X, Y, f_theta)和((X-f_x (R,量化(Y R (2), X R (1)), f_theta))。^ 2 + (Y-f_y (R,量化(y R (2), x R (1)), f_theta)) ^ 2);
f_theta = @ R (R,θ)*的(大小(θ));
Rest3 = fminsearch (@ (R) err_fcn (R,点(1:),点(2:),f_theta), 20 e - 3 * (1 1 1));
您还可以允许额外的参数以适应,例如主要和次要的半径和角度轴的椭圆。但是,这开始成为匿名函数处理,而凌乱的代码在这个阶段,这里我倾向于过渡到适当的matlab函数文件,只是为了保持干净的代码。
HTH
2的评论
Bjorn Gustavsson
Bjorn Gustavsson 2023年1月13日
编辑:Bjorn Gustavsson 2023年1月13日
这就是我的第一个例子。对于一般circle-fitting函数遵循良好的链接文件交换的贡献,更一般的情况下解决这个问题。
HTH

登录置评。


马特·J
马特·J 2023年1月13日
错误= @ (R) abs (vecnorm (POINTS-R) - R);
1评论
马特·J
马特·J 2023年1月13日
编辑:马特·J 2023年1月13日
我有测量误差距离的误差= @ (R) abs(规范([R-POINTS(我),R-POINTS(我)])- R)) ....所以我必须把这个应用到列表中的每一个点。
不,你不需要实现一个单独的每一点误差函数(:,我)。有矢量函数计算出所有的错误,这就是我的答案给你。
我想找最小化总误差的半径。
如果你知道圆的中心(x0, y0)已经最小化R是empricial距离的平均值。没有必要fminsearch。
R =意味着(vecnorm(分——(x0, y0)))

登录置评。


里卡多。玛丽
里卡多。玛丽 2023年1月13日
谢谢大家的回答。
我很抱歉如果我无法清晰,因为我不能分享太多abount代码和项目。
我使用了proprosed的解决方案 在这里 。总而言之,我这样做:
N =长度(点);
f =细胞(N, 1);
i = 1: N
f{我}= @ (R) abs(规范([R-POINTS(我),R-POINTS(我)])- R);
结束
夏天totdist = @ (R) (f, R);
:
函数夏天y = (f, R)
y = 0;
i = 1:元素个数(f)
y = y + f {} (R);
结束
结束
1评论
马特·J
马特·J 2023年1月13日
编辑:马特·J 2023年1月13日
这是一个糟糕的解决方案。非常缓慢,效率低下。我希望你们重新考虑其他建议。
点=兰德(100000);R = 0;
抽搐;
N =长度(点);
f =细胞(N, 1);
i = 1: N
f{我}= @ (R) abs(规范([R-POINTS(我),R-POINTS(我)])- R);
结束
夏天totdist = @ (R) (f, R);
version1 = totdist (R);%计算
toc;
运行时间是0.279596秒。
抽搐
errorFcn = @ (R)规范(vecnorm (POINTS-R) - R, 1);
version2 = errorFcn (R);%计算
toc
运行时间是0.006358秒。
version1, version2%相同的结果
version1 = 7.6622 e + 04
version2 = 7.6622 e + 04

登录置评。

标签

2022世界杯八强谁会赢?


释放

R2022a

世界杯预选赛小组名单社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!世界杯预选赛小组名单

开始狩猎!

Baidu
map