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即可新增網格...