【问题标题】:Newton's Method牛顿法
【发布时间】:2017-10-05 12:55:53
【问题描述】:

我正在尝试使用牛顿法(对任何其他方法开放)找出方程约束的根。方程约束取决于具有一个未知项的二次方程的根。方程描述(二次和约束)如下所示。假设二次方程的根为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)

【问题讨论】:

  • 我不明白这个约束。是不是缺少一些关系运算符(例如=, &lt;=, &gt;=;顺便说一句。第一行也不是等式,因为它缺少=)?约束是一个函数,你想找到函数的根吗?如果是,该函数的参数是什么?我只看到常数。如果我理解正确, p1 和 p2 也是常数,因为它们被定义为第一个函数的根。第一行的xunknown有什么区别?
  • 方程已更新。您可以单击 EquationImage 链接。两个方程都等于零。 p1 和 p2 是二次方程的根。假设在一个二次方程 ax^2+bx+c 中,假设 b 是未知的。我在第一行说未知的情况也是如此。这就是为什么 p1 和 p2 在我的约束中用 unknown 表示。我想通过我的约束找到未知。
  • 你的方程式不清楚。 x 和未知数;所有这些常数都可以组合起来。这是一个糟糕的视觉。你期望从这个等式中得到什么? x 的值和根为零且满足约束的未知数?牛顿对单个方程的根的方法是一回事。方程组的 Newton-Raphson 迭代解是另一个。你想做什么?
  • True 所有这些常量都可以合并为一个。我试图从满足约束方程的二次方程中找到未知的人。如果需要,我愿意接受任何其他方法。
  • 我想我得到了你想要做的。第一行实际上是一个函数 f(x)=... 这个函数的根将是 p1 和 p2 (f(p1)=0, f(p2)=0)。这些根将是包含常量和 unknown 变量的表达式。您将这些根替换为您的约束,并希望找到满足约束的 unknown。它是否正确?您知道函数的外观吗,即您是否为合理的常数值绘制了它?牛顿的表现很大程度上依赖于起点。你是怎么选择的?顺便说一句,不要链接到包含文本的图像。

标签: matlab numerical-methods


【解决方案1】:

我不认为您的 f(x) 代码对应于上面列出的等式:在 MATLAB 代码中,1/(poles2-poles1)exp((...)poles2)exp((...)poles1) 项相乘,您有 1/(c1*c2) - poles1 而不是 @987654326 @。

我没有检查过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;

【讨论】:

  • @Steve-我已经按照您的指出编写了我的代码,但它并没有解决问题。它在 3 次迭代后冻结。上面的代码更新了。
  • @Steve- MATLAB 代码 1/(poles2-poles1) 将两个 exp((...)poles2) 相乘。----这就是我想要的。方程约束也是如此。我们的想法是在“x”中找到满足约束条件的“未知人”。
  • @SoumyajyotiMaji 它是如何冻结的?导致它挂起的第四次迭代是什么?您可以使用分析器运行它进行 1、2 和 3 次迭代,看看是否有一部分代码花费了指数级的时间?
猜你喜欢
  • 2013-10-17
  • 2017-05-05
  • 1970-01-01
  • 2019-06-27
  • 1970-01-01
  • 2012-06-24
  • 2013-10-24
  • 2019-06-19
  • 2015-01-06
相关资源
最近更新 更多