matlab中怎樣從曲線中獲得精確的座標值

2021-03-08 23:50:49 字數 5292 閱讀 3010

1樓:匿名使用者

提供幾種不同的做法,供參考。

方法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(想來應該是重力加速度),應該是有意為之的吧?

2樓:匿名使用者

%此程式是找到z=1.976e+004的x,y座標,我測試過,可以的,但是必須你的z值必須是畫圖的曲線中的點,如果不是就需要插值就麻煩了,由於精度問題,在找z值匹配的時候,我將z的精度調為4位有效,所以你選取的z值都要取四位有效

h = get(gca, 'children');

x1 = get(h, 'xdata');

y1 = get(h, 'ydata');

z1=get(h,'zdata');

idx=find(double(vpa(z1,4))==1.976e+004);%可以用其他數值替換

a1=x1(idx);

a2=y1(idx);

vpa(a1,10)

vpa(a2,10)

matlab中怎麼顯示公式,matlab中影象顯示函式

clc clear syms x y 定義符號 x y z x exp y disp z 建立符號關係式並顯示 x 1,y 2,eval z x y 賦值後計算 開啟mathtype,preferences translator 然後如下面的設定 然後再mathtype裡面輸入乙個公式,然後拷貝到乙...

matlab中怎樣計算矩陣中每個數的平方

使用點運算。如果原矩陣式a,可以使用a.a或者a.2matlab中點運算是對相同維數的矩陣的對應元素進行相應的運算。點乘,相同維數的矩陣的對應元素相乘。點乘冪,a.b相同維數的矩陣a元素的b對應元素次冪。a.n矩陣a中所有元素取n次冪。點左除,相同維數的矩陣的對應元素進行 運算。點右除,相同維數的矩...

怎樣在matlab圖形中新增網格

有幾種方法,你借鑑一下 x 0 0.01 2 y x plot x,y 1 set gca,xgrid on 2 set gca,xminorgrid on 3 grid on 4 grid minor 1 開啟matlab的plot函式的乙個圖形。2 在plot函式後加上grid on即可新增網格...