1樓:匿名使用者
樓主的意思是:已知**上的一條曲線,如何獲取該曲線上點的座標(x,y)。
下面有段程式,是本人讀曲線座標所寫,看看對樓主是否有幫助:
clcclear all
im1 = imread('runx2.jpg'); %樓主在此替換成自己的**.
im = rgb2gray(im1);
im = im(end:-1:1,:);
%imshow(im)
[m,n]=size(im);
cordx=;
cordy=;
for i=1:m
for j=1:n
if im(i,j)<100 %這個引數100可以在 0~255 之間隨意改變,值越小越精確.
cordx=[cordx i];
cordy=[cordy j];
endend
endx=;y=;%得到的座標
l=2;%此處引數可調
for k=1:l:length(cordx)x=[x cordx(k)];
y=[y cordy(k)];
end[xx ind]= sort(y);
yy = x(ind);
plot(xx,yy,'+')
*** = unique(xx);
yyy = zeros(size(***));
for k = 1:length(***)indxx = xx==***(k);
n = sum(indxx);
yyy(k) = sum(indxx.*yy)/n;
endfigure
plot(***,yyy,'+')
runx2 = [***' yyy'];
2樓:
你好你可以使用
[x,y]=ginput
回車以後你就可以輸出改點的x,y座標了
希望對你有幫助
3樓:
曲線方程都有了,那輸入、輸出(座標點)應該可以計算出來的。
還是我對你的問題沒有理解了?
4樓:匿名使用者
以取點座標的方式,把曲線匯出來。先把擬合的曲線儲存在workspace裡, 然後x=[1 2 3 4 5], (確保取值在x 區間內)再求y=fittedmodel(x) 就能知道擬合曲線的座標啦
matlab中怎樣從曲線中獲得精確的座標值~~~~~~~~~~~~~~
5樓:匿名使用者
提供幾種不同的做法,供參考。
方法1:
*****
直接從繪圖資料插值(經檢驗z資料是單調增加的),**如下:
syms x y z
eq1=-2.*pi.*0.
05415.*0.0000002.
*sin(x).*sin((5.*pi.
/6)+x)-4./3.*pi.
* ...
0.0000002.^3.
*2000.*z.*9.
8+2./3.*pi.
*z.*9.8.
*0.0000002.^3.
* ...
(1820-1000).*(cos(x)).^3-2./3.*pi.*z.*9.8.*0.0000002.^3.* ...
(1820+1000)-pi.*z.*9.8.*0.0000002.^2.*(y+0.0000002.*cos(x)).* ...
(1820-1000).*(sin(x)).^2;
eq2=-sin((5.*pi./6)+x).*besselk(0,(z.*9.8.*(1820-1000)./0.05415).^ ...
0.5.*0.
0000002.*sin(x))+(z.*9.
8.*(1820-1000)./0.
05415).^0.5.
* ...
y.*besselk(1,(z.*9.
8.*(1820-1000)./0.
05415).^0.5.
*0.0000002.*sin(x));
z=solve(eq1,z);
eq=subs(eq2,z,z);
h=ezplot(eq,[0.52 0.5245],[-1e-9 0]);
x=get(h,'xdata');
y=get(h,'ydata');
view(-10,35)
grid on
zz=subs(z,,);
x(zz>20000)=;
y(zz>20000)=;
zz(zz>20000)=;
set(h, 'xdata', x, 'ydata', y, 'zdata', zz, 'linewidth', 2);
title('')
zlabel('z')
axis tight
box off
zi = [1 10 100 1000 5000 10000 19000 20000];
xi = interp1(zz, x, zi, 's');
yi = interp1(zz, y, zi, 's');
vpa([xi; yi].',10)
舉例:------
上面的**中z分別取[1 10 100 1000 5000 10000 19000 20000],得到的結果如下(每行代表一組對應的x、y):
[ .5235988072, .1770687259e-12]
[ .5235990919, -.3682753278e-13]
[ .5236019385, -.2134703182e-11]
[ .5236304028, -.2157265249e-10]
[ .5237568792, -.9522223488e-10]
[ .5239149030, -.1794854554e-9]
[ .5241991463, -.3217413726e-9]
[ .5242307131, -.3370566367e-9]
把資料代回方程,看一下精度:
>> eq = subs([eq1; eq2], , )
eq =
1.0e-005 *
0.0000 -0.0000 -0.0000 -0.0000 0.0000 -0.0000 -0.0000 -0.0000
0.2096 0.2519 0.3885 0.0182 0.0055 0.0072 0.0034 -0.0010
>> norm(eq)
ans =
5.0868e-006
說明:------
(1)你所貼**的前半部分本來用於說明兩個曲面相交的,如果只畫線,該部分屬於多餘;
(2)順便修正一點小錯誤——原**的這兩句有點小問題:
x(z>20000)=nan;
y(z>20000)=nan;
我上次還有點奇怪,為什麼座標範圍看上去不太對勁,但沒有深究。剛才發現是這兩句寫錯了,x、y應該是大寫的。另外,現在為符合插值的需要應把右側nan改為空矩陣()。
(3)有多種插值方法可用,我使用了最有利於平滑曲線的樣條插值,樓主也可以試試其它做法。
(4)注意z0取值的範圍最好不要超過[min(z) max(z)]=[8.45 19943],如果超出該範圍,部分方法需要通過引數指定允許interp1外插(預設情況下,樣條插值允許外插,但線性插值不允許)。
(5)由於方法本身是基於部分離散點資訊得到未知點的,所以很難說是否能保證精度。
(6)相容性:這裡的繪圖**在2007b上測試沒問題,但在6.5上不行,更高版本沒試,也可能會有問題。
方法2:
*****
從原始問題出發,直接解方程,**如下:
syms x y z
eq1=-2.*pi.*0.
05415.*0.0000002.
*sin(x).*sin((5.*pi.
/6)+x)-4./3.*pi.
* ...
0.0000002.^3.
*2000.*z.*9.
8+2./3.*pi.
*z.*9.8.
*0.0000002.^3.
* ...
(1820-1000).*(cos(x)).^3-2./3.*pi.*z.*9.8.*0.0000002.^3.* ...
(1820+1000)-pi.*z.*9.8.*0.0000002.^2.*(y+0.0000002.*cos(x)).* ...
(1820-1000).*(sin(x)).^2;
eq2=-sin((5.*pi./6)+x).*besselk(0,(z.*9.8.*(1820-1000)./0.05415).^ ...
0.5.*0.
0000002.*sin(x))+(z.*9.
8.*(1820-1000)./0.
05415).^0.5.
* ...
y.*besselk(1,(z.*9.
8.*(1820-1000)./0.
05415).^0.5.
*0.0000002.*sin(x));
zi = [1 10 100 1000 5000 10000 19000 20000];
xi = sym( zi*0 );
yi = xi;
for i = 1 : length(zi)
z0 = zi(i);
[xi(i), yi(i)] = solve(subs(eq1,z,z0), subs(eq2,z,z0));
endvpa([xi-2*pi; yi].',10)
舉例:------
與方法1 的測試用例相同,得到的結果如下:
[ .523598806, -.3251499235e-13]
[ .523599091, -.2887359289e-12]
[ .523601938, -.2523219710e-11]
[ .523630402, -.2159081181e-10]
[ .523756878, -.9522774887e-10]
[ .523914902, -.1794926954e-9]
[ .524199145, -.3217447875e-9]
[ .524230712, -.3370556700e-9]
同樣,檢驗一下精度:
>> eq = subs([eq1; eq2], , );
>> eq=double(eq)
eq =
1.0e-018 *
0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
0.0000 0.0002 0.0021 0.0182 0.0812 0.1539 0.2774 0.2907
>> norm(eq)
ans =
4.3823e-019
說明:------
(1)由於求解方程組得到x總是位於要求的座標範圍之外,所以把它減小2*pi。
(2)這種方法需要符號數學工具箱的支援,精度遠高於前一種方法。
(3)相容性:用solve解方程的結果可能和符號數學工具箱版本相關,我用maple核心的6.5和2007b做了測試,可以求出想要的結果,但在mupad核心的版本上可能會有問題。
方法3:
*****
使用數值方法解方程。本來以為第2種方法有些條件下會失效,所以考慮這種做法,但從實際情況看,方法2的效果很好,所以,這個就不做了。
***********************************=
最後,八卦幾句:
已經多次回答樓主的問題了,有點好奇您是從**找到這麼多複雜的表示式要求解的,和您的工作有關嗎?而且難得的是,問題看上去雖然比較複雜,但根據樓主提供的資訊,剛好都是可以求解的,簡直就像是考試的試題一般。
順便說一下,我注意到,這次的方程與上次我回答的問題相比,有7處由9.78換成了9.8(想來應該是重力加速度),應該是有意為之的吧?