c - 有没有办法调整这个非线性方程组

标签 c math mathematical-optimization

最近两天我一直在解决这个问题,但没有成功。 假设我们有这个系统: system

当 :

condition

为了获得角度 Theta 的值,我使用这个公式:

solution

我得到的值是正确的,但仅在某些点上是正确的,因为系统无法求解。 这是它的样子:

anlge

红色曲线代表“必须”值,蓝色曲线代表我实际得到的值。

绘制总和值后:

condition

这是我得到的: error 如您所见,它是正弦曲线,似乎影响了角度的“必须”值。

为了模拟这一点,我一直在使用这个程序:

      #include <stdio.h>
#include <math.h>


int main (){
  float xin =0;
  float yin =0;
  float zin =0;
  float A =0;
  float B =0;
  float C =0;
  float angle =0;
  float outangle =0 ;
  float angledeg =0;
  while (angledeg <=(360*3)) {

    angle = angledeg * M_PI/180;
    xin = 0.11;
    yin = (sin(angle) / sqrt(3))  + xin;
    zin = (xin - (sin(angle +(120*M_PI/180))));
    A  = yin - xin;
    B  = xin - zin;
    C  = zin - yin;
    outangle = atan2((A*sqrt(3)) , (B -C) )   * 180/M_PI; // 100% correct 
    printf ("%lf \n" , outangle);
    angledeg++;
  }

  return 0;
}

所以我的问题是:如何使用 sum 的值来调整“必须是”角度值(红色曲线)的结果值

更新

我不知道这是否有意义但它有效:删除 sqrt(3) :

yin = (sin(angle) / sqrt(3))  + xin;

我真的不明白,但它工作正常吗?知道为什么吗?

最佳答案

考虑到这一点,您可以大大简化情况

sin(t)+sin(t+120°)+sin(t+240°)=0

就是说单位圆上任意等边三角形的(重)心为原点。

因此

sin(t)/sqrt(3)+sin(t+120°)+sin(t+240°)=sin(t)*(1/sqrt(3)-1)

所以 t=theta 的唯一值使系统可解的是t=0°t=180° .


在计算方面

y=x+sin(t)/sqrt(3); z=x-sin(t+120°)

你为C生产值(value)

z-y = - sin(t+120°) - sin(t)/sqrt(3)

因此

B-C = 2*sin(t+120°) + sin(t)/sqrt(3)
    = -sin(t) + sqrt(3)*cos(t) + sin(t)/sqrt(3)

在某种期望中,您只期望中间项,这​​对于 sin(t)=0 是正确的, 再次为 t=0°t=180° .

关于c - 有没有办法调整这个非线性方程组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29588435/

相关文章:

创建 -* 选项,处理程序参数

html - 使用C通过cgi生成简单的html页面

java - 寻找最少的移动次数

c++ - 如何生成第n个只有偶数位的数?

c - setenv() 更新 PATH 环境变量

c - 代码的输出是什么?

math - 橡皮筋效应

python - 计算多变量函数在 Python 中的间隔之间取值的有效方法

optimization - 用于约束优化的 Nelder Mead 算法?

r - 使用 betareg 时出现 "non-finite value supplied by optim"错误