2017-10-05 96 views
-1

我想用牛頓法找出方程約束的根(對任何其他方法都是開放的)。等式約束取決於具有一個未知項的二次方程的根。公式描述(二次和約束)如下所示。二次方程的根假定爲p1p2牛頓法

x^2 + x*(c1*unknown/2 + C1*c2)/(c1*c2*c3*unknown/2) + 1/(c1*c2*c3*u/2) = 0 

與約束

(1/(p2-p1))*(exp(-0.3*p2) - 1)*(c1*c2 - p2) - (exp(-0.3*p1) - 1)*(c1*c2 - p1) - 0.04 = 0 

我想知道是否有任何其他的近似方法,如果牛頓法是不會這樣做來解決這個問題。

MATLAB代碼

p0=10*10^6; 
Cc=0.65*10^-6;Rp=100*10^3;Cp=55*10^-9; z1=1/(Cp*Rp); 
N = 100;error = 0.02; 
syms 'x' 
a = 1; 
b = ((Cc*(x/2+Rp))/(Cc*Cp*Rp*x/2)); 
c = 1/(Cc*Cp*Rp*x/2); 
poles1 = (-b + sqrt(b^2 - 4*a*c))/(2*a); 
poles2 = (-b - sqrt(b^2 - 4*a*c))/(2*a); 

p1_subterm = (exp(-0.3*poles1) - 1)*(z1 - poles1); 
p2_subterm = (exp(-0.3*poles2) - 1)*(z1- poles2); 
f(x) = (1/(poles2 - poles1))*p2_subterm - p2_subterm - 0.04;   
df = diff(f); 
while i <= N 
p = p0-(f(p0)/df(p0)) 
if (abs(p - p0)/abs(p)) < error 
fprintf('Solution is %f \n', double(p)) 
return 
end 
i = i + 1; 
p0 = p; 
end 
fprintf('Solution did not converge within %d iterations \n', N) 
+0

我不明白的約束。是不是缺少一些關係運算符(如'=,<=, > ='; btw。第一行不是因爲它缺少'='而不是一個等式)?約束是一個函數,你想找到函數的根?如果是的話,這個函數的參數是什麼?我只看到常量。如果我理解正確,p1和p2也是常量,因爲它們被定義爲第一個函數的根。第一行的* x *和* unknown *有什麼區別? –

+0

公式更新。你可以點擊EquationImage鏈接。兩個方程都等於零。 p1和p2是二次方程的根。假設在一個二次方程ax^2 + bx + c中,假設b是未知的。我的情況也是如此,我在第一行中說不詳。這就是爲什麼p1和p2在我的約束下用未知表達的原因。我想通過我的約束找到未知的。 –

+0

你的方程不清楚。 x和未知數;所有這些常數都可以合併。這是一個糟糕的視覺。你期待什麼來擺脫這個等式? x和未知根值爲零且約束滿足的值?牛頓的單方程根源方法是一回事;另一個是方程組的Newton-Raphson迭代解。你想做什麼? – duffymo

回答

-1

我不認爲你的f(x)碼對應上面列出的公式:在MATLAB代碼1/(poles2-poles1)乘兩個exp((...)poles2)exp((...)poles1)方面,你有1/(c1*c2) - poles1而不是c1*c2 - poles1

我還沒有檢查通過poles1poles2條款,因爲我發現10組括號恐嚇。它會建議通過將每個方程分解成更短,更清晰的行來使您的代碼更具可讀性。

注意到,我們可以通過c1*c2*c3*unknown乘以二次,

(c1*c2*c3*unknown)*x^2 + x*2*(c1*unknown/2 + C1*c2) + 2 = 0 

那麼你可以寫polesf代碼

% Here unknown is x 
syms 'x' 
a = c1*c2*c3*x; 
b = c1*x + 2*c1*c2; 
c = 2; 
poles1 = (-b + sqrt(b^2 - 4*a*c))/(2*a); 
poles2 = (-b - sqrt(b^2 - 4*a*c))/(2*a); 

p1_subterm = (exp(-0.3*poles1) - 1)*(c1*c2 - poles1); 
p2_subterm = (exp(-0.3*poles2) - 1)*(c1*c2 - poles2); 
f(x) = (1/(poles2 - poles1))*p2_subterm - p2_subterm - 0.04; 
+0

@ Steve-我已經指出了我的代碼,但它並未解決問題。它在3次迭代後凍結。代碼在上面更新。 –

+0

@史蒂夫 - MATLAB代碼1 /(poles2-poles1)將exp((...)poles2)相乘.----這就是我想要的。等式約束也如此。這個想法是在這裏找到'不知名的人''x'來滿足約束條件。 –

+0

@SoumyajyotiMaji它如何凍結?第四次迭代是什麼導致它掛起?你能用分析器對它進行1次,2次和3次迭代運行,看看是否有一部分代碼花費了指數量的時間? – Steve